Python TCP接收/发送信息
一 简单介绍一下几个知识点
- TCP: 它是一种面向连接、基于字节流的传输层通信协议。其本质是一种一对一连接模式,在这种情况下TCP不适合用于广播型应用程序,请注意广播型应用程序应采用UDP协议。
- socket: 套接字是一个功能模块,在此我们主要使用它来接收和发送数据。
- 网络协议版本: IPV4与ipv6相比尚未成普及趋势,在这种情形下IPv6尚未被广泛采用;然而由于其尚未普及趋势而现仍主要沿用IPv4版本。
- IP地址与端口: 要向某方发送信息,则需为其提供对应的IP地址(此处可仅提供本地IP地址;如不清楚则可执行cmd命令并输入ipconfig查看);选择任意一个非关键端口号即可。
- 编码: 就是指将字符串转换为相应的位模式以便在特定系统中使用;值得注意的是解码则是编码过程中的逆操作。
二 tcp发送数据(TCP客户端)
客户端 就是要向 服务端 发数据 所以比较好理解
简单说一下步骤:
- 导入socket模块
- 创建TCP套接字
- 建立连接(与服务端)
- 发数据
- 关闭套接字
看代码:
# 1导包
import socket
# 2初始化套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3建立链接 要传入链接的服务器ip和port
tcp_socket.connect(('192.168.52.1', 11000))
# 4发数据
tcp_socket.send('哈哈呵呵呵'.encode())
# 5断开
tcp_socket.close()
这里有一个叫做网络调试助手的工具 ,点击下载按钮进行安装 ,单击下载按钮后即可完成安装 ,并用于测试网络调试
三 tcp接收信息(TCP服务器):
有了发送数据的客户端,现在建立一个专门用于接收信息的服务器. 简单来说有六个步骤.
导入socket库
建立TCP连接
绑定指定IP地址及端口号
设置为被动监听状态 并使最大并发连接数设定为128(此操作仅在服务器模式下有效)
等待接受连接请求 得到的是一个元组 包含(客户机连接的对象:包括客户机地址及端口)
释放连接资源
下面直接看代码: ↓ (因为ip的问题,测试时把WiFi关掉)
# 导包
import socket
# 2初始化套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3 服务器绑定ip和port
tcp_socket.bind(('192.168.52.1', 12000))
# 4 设置为被动监听模式 最大并发接收的数量是128
tcp_socket.listen(128)
# 5 等待接收链接请求 接收到一个元组 (客户端的socket对象,(客户端的地址,端口))
client, addr = tcp_socket.accept()
# 接收要用客户端的socket对象接收,因为发的时候就是用他的对象发的
data = client.recv(1024)
# 发送的格式是字节,要解码,decode()默认gbk
print(data.decode())
# 6断开
tcp_socket.close()
现在客户端有了,服务端也有了,那我们完善一下代码
1.完善服务端代码:
首先处理服务端的部分。程序不能仅接收一次数据后就终止运行,因此建议添加一个循环机制,持续接收数据
import socket
# 1初始化套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置地址可以复用,解决了 端口没有及时释放的问题
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2 服务器绑定ip和port
tcp_socket.bind(('192.168.52.1', 12000))
# 3 设置为被动监听模式 最大并发接收的数量是128
tcp_socket.listen(128)
while True:
# 4 等待接收链接请求 接收到一个元组 (客户端的socket对象,(客户端的地址,端口))
client, addr = tcp_socket.accept()
print('client:', client)
print('addr:', addr)
while True:
data = client.recv(1024)
print(data.decode('gbk'))
if not data:
# 如果数据为空 说明客户端关闭了链接 这里的client也就可以关闭
client.close()
break
# 5断开
tcp_socket.close()
请说明:服务器接收的是(客户端发送的:客户端套接字对象)。既然客户使用这个套接字对象发送信息,则我们同样应该使用这个套接字对象来进行回复。想象一下,在这种情况下如果有多个客户端发送连接请求该怎么办?比如小A已经与我的服务器建立了连接,请问现在程序继续运行时处理数据时小B再尝试建立连接就无法成功!因为此时服务器已经不再接受新的连接请求!)这种情况同样是能够解决的哦!因为他是对每个发送来的socket(即客户端套接字对象)进行单独处理。(这里类似于许多人拨打客服电话时会被分配到一名客服人员进行沟通)有兴趣的话可以通过以下链接查看一个小案例:TCP 聊天室
2.完善客户端代码:
客户端通过socket对象实现数据发送功能的同时, 也可以通过同样的socket实例来完成接收任务(具体来说, 这个过程实际上是客户端socket实例负责接收 incoming messages)
import socket
# 1初始化套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2建立链接 要传入链接的服务器ip和port
tcp_socket.connect(('192.168.52.1', 11000))
while True:
text = input('发送的数据')
# 3发数据
tcp_socket.send(text.encode('gbk'))
# 4接收数据
data = tcp_socket.recv(1024)
print(data.decode('gbk'))
# 5断开
tcp_socket.close()
在测试过程中务必注意遵守编码规范,并处理好服务器配置(地址问题)以及端口号设置(端口问题),这些细节因具体情况而异。
最后结尾了,说一下TCP 和 UDP 的不同点:
- 基于连接的通信采用在双方建立三方会话确认后才会展开的数据传输。
- 按顺序发送数据。
- 检测到数据包丢失后会发送补充数据包。
- 识别到重复数据后会丢弃多余的副本。
- 确保在传输过程中没有错误发生。
- 通过流量控制机制防止网络拥塞。
还有一个关于TCP的小案例 : TCP传输协议用于下载文件 TCP下载文件实例
udp的收发信息 UDP收发信息
