Python使用python通过TCP或UDP,实现收发报文数据
Posted 将冲破艾迪i
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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() # 关闭连接
- 本地主机名也可以换成IP地址,如
host = '192.168.1.100'
- server 端需要一直运行,等待 client 端的连接,所以使用
while True
无限循环- 发送的数据必须是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端窗口:
$ py tcp_server.py
<socket.socket fd=452, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.1.100', 1000), raddr=('192.168.1.100', 61235)>
b'\\x01d\\xff'
client端窗口:
$ py tcp_client.py
Hello 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端窗口:
$ py udp_server.py
b'\\x01d\\xff' ('192.168.1.100', 53048)
client端窗口:
$ py udp_client.py
Hello Client ('192.168.1.100', 1000)
Python3.x基础学习-UDP和TCP用法
UDP和TCP使用方法
UDP:
发送数据:
# 1.创建socket(套接字) # 2.使用socket发送或接收数据 # 3.关闭套接字 import socket # 1.创建socket(套接字)对象 udp_socket = socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM) #2.使用socket发送或者接收数据 send to(数据,地址) data = ‘你好‘ b_data= data.encode(‘utf-8‘) # 将字符串转化为字符串 ip = ‘192.168.31.84‘ # ip是字符串 port= 7777 # 端口号是整数 dest_address = (ip,port) # 地址是元组 udp_socket.sendto(b_data,dest_address) # 3.关闭套接字 udp_socket.close()
接收数据:
import socket while True: udp_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM) # 2.使用socket接收数据 # 绑定端口号bind(ip,port)s udp_socket.bind((‘192.168.31.84‘, 7777)) # 等待接收消息 recvfrom() # 结果是元组,第一个元素是消息内容,第二个元素是地址 recv_info = udp_socket.recvfrom(1024) # 一次接收的最大字节数 # print(recv_info) try: content = recv_info[0].decode(‘utf-8‘) except: content = recv_info[0].decode(‘gbk‘) address = recv_info[1] print("消息是:%s 头是%s"%(content,address)) # 3.关闭套接字 udp_socket.close()
练习:做一个简易的聊天工具
# 在一个电脑中编写1个程序,有2个功能 # 1.获取键盘数据,并将其发送给对方 # 2.接收数据并显示 # 并且功能数据进行选择以上的2个功能调用 # # 简易版upd聊天器 # ============================== # 1. 发送消息 # 2. 接收消息 # 3. 退出聊天 # ============================== # 请输入您选择的功能: # ip = ‘192.168.31.84‘ # port = 1234 import socket def send(udp_socket): ip = ‘192.168.31.84‘ port = 1234 address = (ip, port) input_msg1 = input("请输入你要发送的内容:") input_msg = input_msg1.encode(‘utf-8‘) print(udp_socket) udp_socket.sendto(input_msg,address) def recv(udp_socket): print("-"*100) print(udp_socket) recv = udp_socket.recvfrom(1024) text = recv[0].decode(‘gbk‘) print(text) def main(): udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 必须把连接对象放最外层 udp_socket.bind((‘192.168.31.84‘, 1234)) while True: input_type = input("请输入要操作的内容 1,服务器,2,客户端 3,退出:") if input_type==‘1‘: send(udp_socket) elif input_type ==‘2‘: recv(udp_socket) elif input_type ==‘3‘: break else: print("什么鬼,不带这样子额") udp_socket.close() if __name__ == ‘__main__‘: main()
TCP
发送数据:
import socket tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) serve_address=(‘169.254.34.50‘,1081) tcp_socket.connect(serve_address) data=‘123‘ b_data=data.encode(‘gbk‘) tcp_socket.send(b_data) tcp=tcp_socket.recv(1024) print(tcp.decode(‘gbk‘)) tcp_socket.close()
接收数据
import socket
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) tcp_socket.bind((‘192.168.31.84‘,1080)) tcp_socket.listen(5) tcp1,tcp2=tcp_socket.accept() tcp3=tcp2.recv(1024) print(tcp3.decode(‘gbk‘)) d_data=‘欢迎光临‘.encode(‘gbk‘) tcp_socket.send(d_data)
以上是关于Python使用python通过TCP或UDP,实现收发报文数据的主要内容,如果未能解决你的问题,请参考以下文章