TCP编程

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

由于TCP连接具有安全可靠的特性,所以TCP应用更为广泛。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。例如,当我们在浏览器中访问明日学院网站时,我们自己的计算机就是客户端,浏览器会主动向明日学院的服务器发起连接。如果一切顺利,明日学院的服务器接收了我们的连接,一个TCP连接就建立起来了,后面的通信就是发送网页内容了。

1  创建TCP服务器

创建TCP服务器的过程,类似于生活中接听电话的过程。如果要接听别人的来电,首先需要购买一部手机,然后安装手机卡。接下来,设置手机为接听状态,最后静等对方来电。

如同上面的接听电话过程一样,在程序中,如果想要完成一个TCP服务器的功能,需要的流程如下:

l  使用socket()创建一个套接字

l  使用bind()绑定IP和port

l  使用listen()使套接字变为可被动连接

l  使用accept()等待客户端的连接

l  使用recv/send()接收发送数据

图标 (35)

  实例01  服务器向浏览器发送“Hello World”

例如,使用socket模块,通过客户端浏览器向本地服务器(IP地址为127.0.0.1)发起请求,服务器接到请求,向浏览器发送“Hello World”。具体代码如下: 

# -*- coding:utf-8 -*-

import socket                                  # 导入socket模块

host = '127.0.0.1'                            # 主机IP

port = 8080                                     # 端口号

web = socket.socket()                           # 创建socket对象

web.bind((host,port))                          # 绑定端口

web.listen(5)                                # 设置最多连接数

print ('服务器等待客户端连接...')

# 开启死循环

while True:

    conn,addr = web.accept()                     # 建立客户端连接

    data = conn.recv(1024)                       # 获取客户端请求数据

    print(data)                             # 打印接收到的数据

    conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello World')        # 向客户端发送数据

    conn.close()                             # 关闭连接

运行结果如图7所示。然后打开谷歌浏览器,输入网址:127.0.0.1:8080(服务器IP地址是127.0.0.1,端口号是8080),成功连接服务器以后,浏览器显示“Hello World”。运行结果如图8所示。

图7  服务器接收到的请求

图8  客户端接到的响应

2  创建TCP客户端

TCP的客户端要比服务器简单很多,如果说服务器是需要自己买手机、插手机卡、设置铃声、等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多。

图标 (35)

  实例02  客户端向服务器发送和接收信息

在实例01中,我们使用浏览器作为客户端接收数据,下面,创建一个TCP客户端,通过该客户端向服务器发送和接收消息。创建一个client.py文件,具体代码如下:

import socket                       # 导入socket模块

s= socket.socket()                  # 创建TCP/IP套接字

host = '127.0.0.1'                  # 获取主机地址

port = 8080                        # 设置端口号    

s.connect((host,port))                 # 主动初始化TCP服务器连接

send_data = input("请输入要发送的数据:")        # 提示用户输入数据

s.send(send_data.encode())             # 发送TCP数据

# 接收对方发送过来的数据,最大接收1024个字节

recvData = s.recv(1024).decode()

print('接收到的数据为:',recvData)

# 关闭套接字

s.close()

打开2个cmd命令行窗口,先运行实例01中的server.py文件,然后运行client.py文件。接着,在client.py窗口输入“hi”,此时server.py窗口会接收到消息,并且发送“Hello World”。运行结果如图9所示。

图9  客户端和服务器通信效果

3  执行TCP服务器和客户端

在上面的例子中,我们设置了一个服务器和一个客户端,并且实现了客户端和服务器之间的通信。根据服务器和客户端的执行流程,可以总结出TCP客户端和服务器的通信模型,如图10所示。

图标 (35)

  实例03  制作简易聊天窗口

既然客户端和服务器可以使用Socket进行通信,那么,客户端就可以向服务器发送文字,服务器接到消息后,显示消息内容并且输入文字返回给客户端。客户接收到响应,显示该文字,然后继续向服务器发送消息。这样,就可以实现一个简易的聊天窗口。当有一方输入“byebye”时,则退出系统,中断聊天。可以根据如下步骤实现该功能。

图10  TCP通信模型

(1)创建server.py文件,作为服务器程序,具体代码如下: 

import socket                               # 导入socket模块

host = socket.gethostname()                 # 获取主机地址

port = 12345                                # 设置端口号  

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)     # 创建TCP/IP套接字

s.bind((host,port))                     # 绑定地址(host,port)到套接字

s.listen(1)                         # 设置最多连接数量

sock,addr = s.accept()                    # 被动接收TCP客户端连接

print('连接已经建立')

info = sock.recv(1024).decode()                 # 接收客户端数据

while info != 'byebye':                      # 判断是否退出

  if info :

    print('接收到的内容:'+info)

  send_data = input('输入发送内容:')               # 发送消息

  sock.send(send_data.encode())                 # 发送TCP数据

  if send_data =='byebye':                  # 如果发送byebye,则退出

    break

  info = sock.recv(1024).decode()             # 接收客户端数据

sock.close()                         # 关闭客户端套接字

s.close()                            # 关闭服务器套接字

(2)创建client.py文件,作为客户端程序,具体代码如下:

import socket                       # 导入socket模块

s= socket.socket()                  # 创建TCP/IP套接字

host = socket.gethostname()             # 获取主机地址

port = 12345                        # 设置端口号

s.connect((host,port))                 # 主动初始化TCP服务器连接

print('已连接')

info = ''          

while info != 'byebye':                  # 判断是否退出

  send_data=input('输入发送内容:')            # 输入内容

  s.send(send_data.encode())             # 发送TCP数据

  if send_data =='byebye':                # 判断是否退出

    break

  info = s.recv(1024).decode()             # 接收服务器数据

  print('接收到的内容:'+info)

s.close()                         # 关闭套接字

打开2个cmd命令行窗口,分别运行server.py和client.py文件,如图11所示。

图11  服务器和客户端建立连接

接下来,在client.py窗口中,输入“土豆土豆,我是地瓜,收到请回答。over”,然后按下<Enter>键。此时,在server.py窗口中将显示client.py窗口发送的消息,并提示server.py窗口输入发送内容,如图12所示。

图12  发送消息

当输入“byebye”时,结束对话,如图13所示。

图13  关闭对话

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TIM输出比较】

TIM输出比较 1.简介1.1.输出比较功能1.2.PWM 2.输出比较通道2.1.结构原理图2.2.模式分类 3.输出PWM波形及参数计算4.案例所需外设4.1.案例4.2.舵机4.3.直流单机 链接: 15-TIM输出比较 1.简介 1.1.输出比较功能 输出比较&#xff0c;英文全称Output Compare&#xff0c;简称O…

AI 情感聊天机器人之旅 —— 相关论文调研

开放域闲聊场景 Prompted LLMs as Chatbot Modules for Long Open-domain Conversation 发布日期&#xff1a;2023-05-01 简要介绍&#xff1a;作者提出了 MPC&#xff08;模块化提示聊天机器人&#xff09;&#xff0c;这是一种无需微调即可创建高质量对话代理的新方法&…

【转载】使用 .NET Upgrade Assistant(升级助手)升级 .NET 老旧版本项目

使用 .NET Upgrade Assistant&#xff08;升级助手&#xff09;升级 .NET 老旧版本项目&#xff1a;https://blog.csdn.net/ChaITSimpleLove/article/details/134711604

【QT问题解决】QT Modbus rtu 拖动主界面时modbus的槽函数无法响应的解决方案

目录 问题 Modbus放在主线程&#xff0c;界面事件会阻塞信号传输解决方案 将modbus放在子线程实现 问题 Modbus放在主线程&#xff0c;界面事件会阻塞信号传输 在使用QT5.14.2时 使用QT自带的QModbusClient类实现对一个力传感器的数据读取。本人为了测试就将modbus读取逻辑等都…

各种编码格式和网站工具

1、url编码 格式如&#xff1a; 中文 > %E4%B8%AD%E6%96%87 hello > hello [] > %5B%5D 在线工具&#xff1a;https://www.bejson.com/enc/urlencode/ 2、utf8编码 格式如&#xff1a; 中文 > \xe4\xb8\xad\xe6\x96\x87 hello > \x68\x65\x6c\x6c\x6f [] >…

基于深度学习的向量图预测

基于深度学习的向量图预测 向量图预测&#xff08;Vector Graphics Prediction&#xff09;是计算机视觉和图形学中的一个新兴任务&#xff0c;旨在从像素图像&#xff08;栅格图像&#xff09;生成相应的向量图像。向量图像由几何图形&#xff08;如线条、曲线、多边形等&…

【网络安全产品】---网闸

了解了不少安全产品&#xff0c;但是对网闸的理解一直比较模糊&#xff0c;今天 what 网闸是安全隔离与信息交换系统的简称&#xff0c;使得在不影响数据正常通信的前提下&#xff0c;让络在不连通的情况下数据的安全交换和资源共享&#xff0c;对不同安全域/网络之间实现真正…

u8g2 使用IIC驱动uc1617 lcd有时候某些像素显示不正确

折腾了很久&#xff0c;本来lcd是挂载到已经存在的iic总线上的&#xff0c;总线原来是工作正常的&#xff0c;挂载之后lcd也能显示&#xff0c;但是有时候显示不正确&#xff0c;有时候全白的时候有黑色的杂点。 解决方案&#xff1a; 1.最开始以为是IIC总线速度快&#xff0…

【机器学习】从理论到实践:决策树算法在机器学习中的应用与实现

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f4d5;引言 ⛓决策树的基本原理 1. 决策树的结构 2. 信息增益 熵的计算公式 信息增益的计算公式 3. 基尼指数 4. 决策树的构建 &#x1f916;决策树的代码实现 1. 数据准备 2. 决策树模型训练 3.…

Vim基础操作:常用命令、安装插件、在VS Code中使用Vim及解决Vim编辑键盘错乱

Vim模式 普通模式&#xff08;Normal Mode&#xff09;&#xff1a; 这是 Vim 的默认模式&#xff0c;用于执行文本编辑命令&#xff0c;如复制、粘贴、删除等。在此模式下&#xff0c;你可以使用各种 Vim 命令来操作文本。插入模式&#xff08;Insert Mode&#xff09;&#…

【Python日志模块全面指南】:记录每一行代码的呼吸,掌握应用程序的脉搏

文章目录 &#x1f680;一、了解日志&#x1f308;二、日志作用&#x1f308;三、了解日志模块⭐四、日志级别&#x1f4a5;五、记录日志-基础❤️六、记录日志-处理器handler&#x1f3ac;七、记录日志-格式化记录☔八、记录日志-配置logger&#x1f44a;九、流程梳理 &#x…

如何在linux中下载R或者更新R

一、问题阐述 package ‘Seurat’ was built under R version 4.3.3Loading required package: SeuratObject Error: This is R 4.0.4, package ‘SeuratObject’ needs > 4.1.0 当你在rstudio中出现这样的报错时&#xff0c;意味着你需要更新你的R 的版本了。 二、解决方…

Openldap集成Kerberos

文章目录 一、背景二、Openldap集成Kerberos2.1kerberos服务器中绑定Ldap服务器2.1.1创建LDAP管理员用户2.1.2添加principal2.1.3生成keytab文件2.1.4赋予keytab文件权限2.1.5验证keytab文件2.1.6增加KRB5_KTNAME配置 2.2Ldap服务器中绑定kerberos服务器2.2.1生成LDAP数据库Roo…

第二十五篇——信息加密:韦小宝说谎的秘诀

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 加密这件事&#xff0c;对于这个时代的我们来说非常重要&#xff0c;那么…

ElasticSearch学习笔记(二)文档操作、RestHighLevelClient的使用

文章目录 前言3 文档操作3.1 新增文档3.2 查询文档3.3 修改文档3.3.1 全量修改3.3.2 增量修改 3.4 删除文档 4 RestAPI4.1 创建数据库和表4.2 创建项目4.3 mapping映射分析4.4 初始化客户端4.5 创建索引库4.6 判断索引库是否存在4.7 删除索引库 5 RestClient操作文档5.1 准备工…

Android RecyclerView原理语法和用法

RecyclerView 是 Android 中用于显示大量数据的高级视图组件。它是 ListView 的改进版&#xff0c;具有更高的性能和灵活性。以下是关于 RecyclerView 的详细介绍&#xff0c;包括其原理、语法、优缺点和使用方法。 原理 RecyclerView 的核心原理是通过视图复用来提高性能。当…

什么是Java中的单例模式?请列举几种常见的单例实现方式,并讨论其优缺点。请解释Java中的设计模式,并列举几种常见的设计模式及其应用场景。

什么是Java中的单例模式&#xff1f;请列举几种常见的单例实现方式&#xff0c;并讨论其优缺点。 Java中的单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。这种模式在多线程环境中特别有用&#xff0c;因…

融资A轮B轮是什么意思?

环境&#xff1a; 融资 问题描述&#xff1a; 融资A轮B轮是什么意思 解决方案&#xff1a; 在A轮融资之前&#xff0c;通常有以下几轮融资阶段&#xff1a; 种子轮&#xff08;Seed Round&#xff09;&#xff1a;这是企业生命周期中最早的融资阶段&#xff0c;通常发生在…

模拟原神圣遗物系统-小森设计项目,设计圣遗物(生之花,死之羽,时之沙,空之杯,理之冠)抽象类

分析圣遗物 在圣遗物系统&#xff0c;玩家操控的是圣遗物的部分 因此我们应该 物以类聚 人与群分把每个圣遗物的部分&#xff0c;抽象出来 拿 生之花&#xff0c;死之羽为例 若是抽象 类很好的扩展 添加冒险家的生之花 时候继承生之花 并且名称冒险者- 生之花 当然圣遗物包含…

求职难遇理想offer!!【送源码】

现在的求职行情确实不太好&#xff0c;有很多抱怨自己找到的工作技术栈落后的同学&#xff0c;我也是建议他们接下先干着。不能幻想毕业之后还能找到更合适的工作&#xff0c;那个时候就基本只能参加社招了&#xff0c;没有工作经验参加社招想要获得满意 offer 的更是地狱难度。…