今日内容:
1. TCP半连接池原理
服务器:
import socket server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(("127.0.0.1",9999)) 不是最大连接数!!! server.listen(5) while True: c,addr = server.accept() while True: try: msg = c.rcv(1024).decode("utf-8") if not msg: c.close() break except BaseException: print("客户端异常断开") c.close() break server.close()
客户端:
import socket client = socket.socket(socket.AF_INET,socket.SICK_STREAM) client.connect(("127.0.0.1",9999)) while True: data = input(">>>:") if not data:continue client.send(daea.encode("utf-8")) msg = client.recv(1024).decode("utf-8") print(msg) client.close()
2.UDP通讯
服务器2:
import socket 创建socket对象 指定type参数为socket.SOCK_DGRAM 表示使用UDP协议 server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) datagram数据报的意思 绑定IP和端口 server.bind(("127.0.0.1",8888)) while True: 接收数据 返回一个元组 数据和 发送的地址 msg,c _addr = server.recvfrom(1024) print("收到来自%s:说:%s"%(c_addr[0],msg.decode("utf-8"))) 发送数据到指定IP和端口 server.sendto(msg.upper(),c_addr)
客户端2:
import socket client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) datagram数据报的意思 while True: msg = input(">>>:") client.sendto(msg.encode("utf-8"),("127.0.0.1",8888)) data,addr = client.recvfrom(1024) print(data.decode("utf-8"))
3.UDP聊天
服务器:
"""
群聊思路
1.客户端先把数据交给服务器
2.服务器先存储对方的地址
3.把收到的数据给所有人的发一遍
"""
import socket server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(("127.0.0.1",8848)) # 如果客户端与服务器在同一台计算机 并且有多个客户端 这些客户端ip都是相同的127.0.01 clients = {} while True: msg,addr = server.recvfrom(1024) # 存储对方的地址: clients[addr[1]] = addr print(msg.decode("utf-8")) # 循环发给所有人 for c in clients: # 这个消息不用给发送方发回去 # if c == addr[1]: # continue server.sendto(msg,clients[c])
客户端1:
import socket c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True: msg = input(">>>:") c.sendto(msg.encode("utf-8"),"127.0.0.1",8848)) msg,addr = c.revfrom(1024) print(msg.decode("utf-8"))
客户端2:
mport socket c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: msg = input(">>>:") c.sendto(msg.encode("utf-8"),("127.0.0.1",8848)) msg, addr = c.recvfrom(1024) print(msg.decode("utf-8"))
4.UDP聊天2
发送机:
import socket c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: msg = input(">>>:") c.sendto(msg.encode("utf-8"),("127.0.0.1",8848)) msg, addr = c.recvfrom(1024) print(msg.decode("utf-8"))
服务器:
""" 群聊思路 1.客户端先把数据交给服务器 2.服务器先存储对方的地址 3.把收到的数据给所有人都发一遍 """ import socket server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(("127.0.0.1",8848)) 如果客户端与服务器在同一台计算机 并且有多个客户端 这些客户端ip都是相同的127.0.01 clients = {} while True: msg,addr = server.recvfrom(1024) 存储对方的地址: clients[addr[1]] = addr print(msg.decode("utf-8")) 循环发给所有人 for c in clients: 这个消息不用给发送方发回去 if c == addr[1]: continue server.sendto(msg,clients[c])
接收机:
mport socket c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 先随便发一条消息给服务器 让服务知道自己的地址 c.sendto("register".encode("utf-8"),("127.0.0.1",8848)) while True: msg, addr = c.recvfrom(1024) print(msg.decode("utf-8"))
今日总结:
1.TCP模板代码
半连接池的工资管理
目前我们的程序是单线程 服务器要么处理通讯要么处理连接请求 无法同时进行
2.TCP 和 UDP 发送数据时的流程
解释 为何TCP是可靠的 是因为发送数据后必须收到确认包
3.UOP的目标代码
与TCP代码的区别
不需要监听 不需要接收
type参数为 SOCK_DGRAM
UDP 可以同时处理多个客户端 是因为CPU处理速度快 给人家感觉是同时处理