Python网络编程—socket套接字编程(UDP)
套接字介绍
1.套接字 : 实现网络编程进行数据传输的一种技术手段
2.Python实现套接字编程:import socket
3.套接字分类
- 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案。(面向连接--tcp协议--可靠的--流式套接字)
- 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案。(无连接--udp协议--不可靠--数据报套接字)
UDP套接字编程
服务端流程
1.创建数据报套接字
sockfd = socket(AF_INET,SOCK_DGRAM)
2.绑定地址
sockfd.bind(addr)
3.消息收发
data,addr = sockfd.recvfrom(buffersize)
- 功能: 接收UDP消息
- 参数: 每次最多接收多少字节
- 返回值: data 接收到的内容
- addr 消息发送方地址
n = sockfd.sendto(data,addr)
- 功能: 发送UDP消息
- 参数: data 发送的内容 bytes格式
- addr 目标地址
- 返回值:发送的字节数
4.关闭套接字
sockfd.close()
1 """ 2 重点代码 3 """ 4 5 from socket import * 6 7 # 创建套接字 8 sockfd = socket(AF_INET, SOCK_DGRAM) 9 10 # 绑定地址 11 server_addr = ('127.0.0.1', 8888) 12 sockfd.bind(server_addr) 13 14 # 收发消息 15 while True: 16 data, addr = sockfd.recvfrom(1024) 17 print("收到的消息:", data.decode()) 18 sockfd.sendto(b'Receive', addr) 19 20 # 关闭套接字 21 sockfd.close()
客户端流程
1.创建套接字
2.收发消息
3.关闭套接字
1 """ 2 重点代码 3 """ 4 5 from socket import * 6 7 # 服务端地址 8 ADDR = ('127.0.0.1',8888) 9 10 # 创建套接字 11 sockfd = socket(AF_INET,SOCK_DGRAM) 12 13 # 循环发送消息 14 while True: 15 data = input("Msg>>") 16 if not data: 17 break 18 sockfd.sendto(data.encode(),ADDR) 19 msg,addr = sockfd.recvfrom(1024) 20 print("From server:",msg.decode()) 21 22 sockfd.close()
练习 : 使用udp完成单词查询,要求一个服务端拥有单词本,从客户端可以循环输入单词,得到单词解释.客户端可以直接回车或者发送特殊字符表示退出
1 from socket import * 2 3 DICT_TEXT = './dict.txt' 4 5 def find_word(word): 6 f = open(DICT_TEXT) 7 for line in f: 8 tmp = line.split(' ')[0] 9 # 遍历的单词已经大于目标 10 if tmp > word: 11 return "没有找到该单词" 12 elif tmp == word: 13 return line 14 else: 15 return "没有找到该单词" 16 17 s = socket(AF_INET,SOCK_DGRAM) 18 s.bind(('0.0.0.0',8888)) 19 20 while True: 21 data,addr = s.recvfrom(1024) 22 mean = find_word(data.decode()) 23 s.sendto(mean.encode(),addr) 24 25 s.close() 26 -------------------------------------- 27 """ 28 udp客户端流程 29 """ 30 31 from socket import * 32 33 # 服务端地址 34 ADDR = ('127.0.0.1',8888) 35 36 # 创建套接字 37 sockfd = socket(AF_INET,SOCK_DGRAM) 38 39 # 循环发送消息 40 while True: 41 data = input("Word>>") 42 if not data: 43 break 44 sockfd.sendto(data.encode(),ADDR) 45 msg,addr = sockfd.recvfrom(1024) 46 print("From server:",msg.decode()) 47 48 sockfd.close()