3 聊天室
1. 运行现象
2.程序
1)版本1:大框架
#1.导入模块 #2.创建socket套接字 #3.接受ip地址,和数据 #4.提取解码打印数据
2)版本2:一次接受数据
#1.导入模块 from socket import * #2.创建socket套接字 udp_socket = socket(AF_INET,SOCK_DGRAM) #绑定接受方端口 udp_socket.bind(("",7790)) #3.接受ip地址,和数据 recv_data = udp_socket.recvfrom(1024) #4.提取解码打印数据 print(recv_data[0].decode("gb2312"))
2)版本3:优化代码
#1.导入模块 from socket import * #2.创建socket套接字 udp_socket = socket(AF_INET,SOCK_DGRAM) #绑定接受方端口 udp_socket.bind(("",7790)) #3.接受ip地址,和数据 recv_data = udp_socket.recvfrom(1024) #4.提取解码打印数据 print(recv_data[1]) print(recv_data[0].decode("gb2312"))
#1.导入模块 from socket import * import time #2.创建socket套接字 udp_socket = socket(AF_INET,SOCK_DGRAM) #绑定接受方端口 udp_socket.bind(("",7790)) #3.接受ip地址,和数据 recv_data = udp_socket.recvfrom(1024) #4.提取解码打印数据 name = recv_data[1] data = recv_data[0].decode("gb2312") name = recv_data[1][0] now_time = "[" + time.ctime() + "] " data = now_time + name + ": " + data print(data)
3)版本3:while True
#1.导入模块 from socket import * import time while True: #2.创建socket套接字 udp_socket = socket(AF_INET,SOCK_DGRAM) #绑定接受方端口 udp_socket.bind(("",7791)) #3.接受ip地址,和数据 recv_data = udp_socket.recvfrom(1024) #4.提取解码打印数据 name = recv_data[1] data = recv_data[0].decode("gb2312") name = recv_data[1][0] now_time = "[" + time.ctime() + "] " data = now_time + name + ": " + data print(data)
4)版本4:多窗口聊天
#1.导入模块 from socket import * import time while True: #2.创建socket套接字 udp_socket = socket(AF_INET,SOCK_DGRAM) #绑定接受方端口 udp_socket.bind(("",7792)) #3.接受ip地址,和数据 recv_data = udp_socket.recvfrom(1024) #4.提取解码打印数据 name = recv_data[1] data = recv_data[0].decode("gb2312") name = recv_data[1][0] now_time = "[" + time.ctime() + "] " data = now_time + name + ": " + data print(data)
问题1:为什么每次都要换端口进行监听??while True错误
Traceback (most recent call last): File "04-多窗口聊天.py", line 10, in <module> udp_socket.bind(("",7791)) OSError: [Errno 98] Address already in use
问题2:while Ture位置?
- 最少的,需要重复运行的代码添加while True
- 1个端口号只能用来标记1个进程,只能绑定1次,
问题3:函数封装
- 代码记得要用函数封装起来
3 老师代码
from socket import * def main(): updSocket = socket(AF_INET, SOCK_DGRAM) #绑定端口,只能绑定1次 updSocket.bind(("",6789)) while True: #核心:收数据,打印 recvInfor = updSocket.recvfrom(1024) print("[%s]:%s"%(str(recvInfor[1]),recvInfor[0].decode("gb2312"))) if __name__ == "__main__": main()