【Python】使用python通过TCP或UDP,实现收发报文数据

1. socket 模块

socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

可以通过socket() 函数来创建套接字对象:

  • socket.socket(socket.AF_INET, socket.SOCK_STREAM):创建socket对象,走TCP通道
  • socket.socket(socket.AF_INET, socket.SOCK_DGRAM):创建socket对象,走UDP通道

socket对象的方法:

1.tcp相关的方法

方法描述
listen()开始TCP监听,设置操作系统可以挂起的最大连接数量
accept()被动接受TCP客户端连接,(阻塞式)等待连接的到来
connect()主动初始化TCP服务器连接
send()发送TCP数据,发送的数据为bytes类型
recv()接收TCP数据,返回的数据为bytes类型

2.udp相关的方法

方法描述
sendto()发送UDP数据,发送的数据为bytes类型,并指定发送的地址(ip, port)
recvfrom()接收UDP数据,返回值是(data,address),address就是(ip, port)

3.公共方法

方法描述
bind()绑定地址(ip,port)到套接字, 在AF_INET下,以元组(ip,port)的形式表示地址
close()关闭套接字
getpeername()返回连接套接字的远程地址,返回值通常是元组(ip,port)
getsockname()返回套接字自己的地址,返回值通常是元组(ip,port)
settimeout(timeout)设置套接字操作的超时期,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作,如connect()
gettimeout()返回当前超时期的值

2. 通过TCP收发报文

1.新建文件tcp_server.py,用于模拟server端。

import socket

tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建socket对象,走tcp通道
host = socket.gethostname() # 获取本地主机名
port = 1000 # 端口号
addr = (host, port)
tcpServer.bind(addr) # 绑定地址
tcpServer.listen(5) # 设置最大连接数,超过后排队

while True:
    conn,addr = tcpServer.accept() # 建立客户端连接
    print(conn)
    data = conn.recv(1024) # 接收来自客户端的数据,小于1024字节
    print(data)
    msg = 'Hello Client'.encode('utf-8')
    conn.send(msg) # 发送数据给客户端
    conn.close() # 关闭连接
    
  1. 本地主机名也可以换成IP地址,如host = '192.168.1.100'
  2. server 端需要一直运行,等待 client 端的连接,所以使用while True无限循环
  3. 发送的数据必须是bytes类型,所以字符串需要编码'Hello Client'.encode('utf-8'),编码后为bytes类型

2.新建文件tcp_client.py,用于模拟client端。

import socket               
 
tcpClient = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建socket对象
host = socket.gethostname() 
port = 1000 
addr = (host, port)
tcpClient.connect(addr) # 连接服务,指定主机和端口号
data = b'\x01\x64\xff' # 报文数据,bytes类型
tcpClient.send(data) # 发送数据给服务端
msg = tcpClient.recv(1024) # 接收来自服务端的数据,小于1024字节
print(msg.decode('utf-8'))
tcpClient.close()

client 端的地址需与 server 端一致,否则会报错:

  • IP地址不一致,则会发送数据给其他服务器,可能会出现报错TimeoutError
  • 端口号不一致,会出现报错ConnectionRefusedError

3.打开两个cmd窗口,一个为server端窗口,另一个为client端窗口。

运行顺序,先启动server,后启动client:

  • server端窗口,先执行命令 python tcp_server.py
  • client端窗口,后执行命令 python tcp_client.py

运行结果如下:

server端窗口:

在这里插入图片描述

client端窗口:

在这里插入图片描述

注:可以看到server端打印的报文为b'\x01d\xff',看上去与client端发送报文b'\x01\x64\xff'不一致,实际上是一致的。
\x01d中的d为ASCII码,d对应的16进制的ASCII码正好是64,也就是说\x01d其实就是\x01\x64的缩写而已。

运行如下代码,可以看到两者报文的长度和内容都是一致的:

clientData =  b'\x01\x64\xff'
serverData = b'\x01d\xff'
print(list(clientData)) # [1, 100, 255]
print(list(serverData)) # [1, 100, 255]

3. 通过UDP收发报文

1.新建文件udp_server.py,用于模拟server端。

import socket

udpServer = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建socket对象,走udp通道
host = socket.gethostname() # 获取本地主机名
port = 1000
serverAddr = (host, port)
udpServer.bind(serverAddr) # 绑定服务端地址

while True:
    clientData,clientAddr = udpServer.recvfrom(1024) # 接收来自客户端的数据
    print(clientData,clientAddr)
    msg = 'Hello Client'.encode('utf-8')
    udpServer.sendto(msg, clientAddr) # 发送数据给客户端
    

2.新建文件udp_client.py,用于模拟client端。

import socket

udpClient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建socket对象,走udp通道
host = socket.gethostname() # 获取本地主机名
port = 1000
serverAddr = (host, port)

data = b'\x01\x64\xff' # 报文数据,bytes类型
udpClient.sendto(data, serverAddr) # 发送数据给服务端
serverData,serverAddr = udpClient.recvfrom(1024) # 接收来自服务端的数据
print(serverData.decode('utf-8'), serverAddr)
udpClient.close()
    

3.打开两个cmd窗口,一个为server端窗口,另一个为client端窗口。

运行顺序,先启动server,后启动client:

  • server端窗口,先执行命令 python udp_server.py
  • client端窗口,后执行命令 python udp_client.py

运行结果如下:

server端窗口:

在这里插入图片描述

client端窗口:

在这里插入图片描述

  • 12
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python可以使用socket模块来实现TCPUDP协议传参。 对于TCP传参,可以使用socket模块中的socket函数创建一个套接字对象,然后使用bind方法绑定一个指定的主机地址和端口号。接着,可以使用listen方法监听连接请求,并使用accept方法接受客户端的连接。在建立连接之后,可以使用send方法向客户端发送数据使用recv方法接收客户端发送的数据。 对于UDP传参,可以使用socket模块中的socket函数创建一个套接字对象,然后可以使用sendto方法将数据发送到指定的主机地址和端口号。在接收数据时,可以使用recvfrom方法从指定的地址和端口号接收数据使用TCP传参时,传输的数据是可靠的,即数据传输过程中不会丢失或损坏,但会保持原有的顺序。而使用UDP传参时,数据传输过程中可能会丢失部分数据或者传输顺序可能发生改变,但是传输速度较快,适合对实时性要求较高的场景。 需要注意的是,在使用TCPUDP传参之前,需要确保目标主机已经开启相应的端口,并且需要根据具体的需求选择合适的TCPUDP协议来传输数据。 ### 回答2: Python可以使用TCPUDP协议进行参数传递。 在使用TCP传参时,可以使用socket库来创建一个TCP客户端和服务器。客户端通过创建套接字,并使用connect()函数连接到服务器的IP地址和端口号。之后,可以使用send()函数将参数发送到服务器。服务器接收到参数后,可以使用recv()函数接收参数,并进行后续的处理。 在使用UDP传参时,同样可以使用socket库来创建一个UDP客户端和服务器。客户端通过创建套接字,并使用sendto()函数将参数发送到服务器的IP地址和端口号。服务器接收参数后,可以使用recvfrom()函数接收参数,并进行后续的处理。 无论是TCP还是UDP,客户端和服务器都需要事先约定好参数传递的格式和规则,以便正确地解析接收到的参数。 值得注意的是,TCP是一种可靠的连接协议,它保证数据的完整性和按序传输。而UDP是一种无连接的协议,它不保证数据的可靠性和按序传输,但是传输效率高。因此,在选择使用TCP还是UDP传参时,需要根据实际情况和需求来做出选择。 总结起来,Python可以使用TCPUDP协议进行参数传递。使用TCP时,需要创建TCP客户端和服务器,通过send()和recv()函数进行参数传递。使用UDP时,需要创建UDP客户端和服务器,通过sendto()和recvfrom()函数进行参数传递。传参时需要注意选择合适的协议,考虑到数据的可靠性和传输效率。 ### 回答3: 在Python中,我们可以使用TCPUDP协议来传递参数。 1. TCP传参: 使用TCP传参可以确保数据的可靠传输,适用于对数据传输的完整性有更高要求的场景。 首先,我们需要创建一个TCP服务器和TCP客户端。服务器负责监听特定的端口,并等待客户端的连接请求。客户端则负责主动发起连接,并向服务器发送数据。 服务器端的代码大致如下: ```python import socket def tcp_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8888)) server_socket.listen(1) while True: client_socket, client_address = server_socket.accept() data = client_socket.recv(1024) # 接收客户端发送的数据 print("Received data:", data.decode()) client_socket.close() tcp_server() ``` 客户端的代码大致如下: ```python import socket def tcp_client(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('localhost', 8888)) data = "Hello, Server!" client_socket.send(data.encode()) # 发送数据给服务器 client_socket.close() tcp_client() ``` 2. UDP传参: UDP传参是一种无连接、不可靠的传输方式,适用于对实时性要求较高的场景。 要实现UDP传参,我们只需创建一个UDP Socket,并指定目标的IP地址和端口号。 服务器端的代码大致如下: ```python import socket def udp_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind(('localhost', 8888)) while True: data, address = server_socket.recvfrom(1024) # 接收客户端发送的数据 print("Received data:", data.decode()) udp_server() ``` 客户端的代码大致如下: ```python import socket def udp_client(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) data = "Hello, Server!" client_socket.sendto(data.encode(), ('localhost', 8888)) # 发送数据给服务器 client_socket.close() udp_client() ``` 以上是使用TCPUDP传递参数的简单示例,通过这两种方式,可以满足不同场景下对数据传输的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值