在线做字网站厦门关键词优化企业
网络编程–udp实现简单的客户端服务端对话
udp与tcp不同,udp不需要连接服务端,不会产生阻塞,可以同时多个客户端给服务端发消息。
基于udp套接字的服务端:
- 创建数据报套接字
- 绑定地址
- 消息的收发
- 关闭套接字
基于udp套接字的客户端:
- 创建套接字
- 消息的收发
- 关闭套接字
利用上述步骤实现多个客户端同时给服务端发送消息
服务端代码:
# udp_server.py
from socket import *# 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM)# 绑定地址
server_addr = ('0.0.0.0', 8888)
sockfd.bind(server_addr)
print('服务端已开启....')
while True:# 接收消息data, addr = sockfd.recvfrom(1024)# 发送消息if data.decode() == '##':print(addr, '已退出')continueprint(addr, '说', data.decode())sockfd.sendto('接收到你的消息'.encode(), addr)
客户端代码:
# udp_client.py
from socket import *# 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM)# 设置要发送到服务端地址
HOST = '127.0.0.1'
PORT = 8888
ADDR = ((HOST, PORT))
# ADDR = (('127.0.0.1', 8888))while True:# 发送消息data = input('>> ')sockfd.sendto(data.encode(), ADDR)if data == '##':break# 接收消息data, addr = sockfd.recvfrom(1024)print(data.decode())
# 关闭套接字
sockfd.close()
还有一种方法是自己输入IP地址和端口号,
写法如下:
# udp_client.py
from socket import *
# 首先导入sys模块
import sys# 因为我们只需要ip和端口号,所以利用sys.argv输入的长度必须大于等于3,后边详解
if len(sys.argv) < 3:print('''argv is error!run aspython udp_client.py 127.0.0.1 8888''')raise# 设置要发送到服务端地址
# HOST = '127.0.0.1'
# PORT = 8888
# ADDR = ((HOST, PORT))
# 改写一下地址方式,获取终端输入的地址和端口号
HOST = sys.argv[1]
PORT = int(sys.argv[2])
ADDR = (HOST, PORT)# 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM)while True:# 发送消息data = input('>> ')sockfd.sendto(data.encode(), ADDR)if data == '##':break# 接收消息data, addr = sockfd.recvfrom(1024)print(data.decode())
# 关闭套接字
sockfd.close()
此图是raise之前的图
加了raise后(windows好像不认识raise),加入不输入端口号,报错信息
E:\tuduPython\code\udp>python udp_client.py 127.0.0.1argv is error!run aspython udp_client.py 127.0.0.1 8888Traceback (most recent call last):File "udp_client.py", line 36, in <module>PORT = int(sys.argv[2])
IndexError: list index out of range
如果多输入一些信息:
E:\tuduPython\code\udp>python udp_client.py 127.0.0.1 8888 123456 hello
>>
此时就进来了,因为我们切出了我们需要的,就算后边还有,但是我们不需要,也就不要紧了。
讲解一下sys.argv
首先要导入sys模块
import sys# 打印输出的内容
print(sys.argv)
运行并打印的内容如下:
E:\tuduPython\code\udp>python argv.py hello word
['argv.py', 'hello', 'word']
打印结果是一个列表,第一个是该文件的名字,从第二个开始是输入的内容(以空格分割),在上边的例子中,我们只需要第一个和第二个,也就是列表的下标为0和1的内容。
The end!