标签:重复执行 set cal 超时 一个 star cli 建立 不能
tcp服务端:
1 from socket import * 2 from threading import Thread 3 4 def client(socket_client, msg_addr): 5 print(">>>有新客户端连接<<<") 6 try: 7 while True: 8 # 接受客户端发来的信息 9 msg = socket_client.recv(1024) 10 if msg: 11 print("%s--> %s" % (msg_addr, msg.decode(‘utf-8‘))) 12 else: 13 print(msg_addr) 14 print("客户端已断开连接...") 15 break 16 except: 17 socket_client.close() 18 19 20 def main(): 21 #建立一个套接字, AF_INET 表示遵从IPv4协议,SOCK_STREAM(流) 表示使用的是tcp协议传输 22 # 若使用UDP协议传输, 则使用SOCK_DGRAM(数据报) 23 server = socket(AF_INET, SOCK_STREAM) 24 25 # 重复使用绑定的信息 26 # 此处若服务端成为tcp四次挥手的第一次,那么服务端最后将等待 2MSL 的时间来接受客户端可能发来的ack 27 # 在这段时间内,若服务器想重复执行,之前被占用的端口等服务不被释放,导致服务器不能被执行 28 #此处加上这句话则解决了这个问题 29 server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 30 31 msg_server = ("localhost", 7788) 32 # 绑定本地的7788端口 33 server.bind(msg_server) 34 #开始监听 35 #此处的listen中的值表示处于半连接和以连接状态的client总和 36 server.listen(5) 37 try: 38 while True: 39 #与客户端建立连接 40 # socket_client表示为这个客户端创建出了包含tcp三次握手信息的新的套接字 41 # msg_addr 包含这个客户端的信息 42 socket_client, msg_addr = server.accept() 43 #为每一个连接服务端的客户端创建出一个单独的线程,并传入上面的两个参数 44 t = Thread(target=client, args=(socket_client,msg_addr)) 45 #在多线程中,创建的socket都共用一个socket_client,所以此时这个套接字不能被关闭 46 #线程只是在cpu的某一个核心中不断的重复切换调用函数而已,所以数据其实都是一份,也是多线程中的数据可以共享的原因 47 t.start() 48 49 finally: 50 server.close() 51 52 if __name__ == "__main__": 53 main()
tcp客户端:
1 from socket import * 2 3 client = socket(AF_INET,SOCK_STREAM) 4 5 server_msg = ("localhost",7788) 6 #连接服务器 7 client.connect(server_msg) 8 9 while True: 10 send = input("要发送的文本内容:") 11 if send == ‘q‘: 12 break 13 14 else: 15 client.send((send).encode("utf-8")) 16 print("发送成功!") 17 18 client.close()
三次握手:
四次挥手:
tcp通信过程中的2MSL的问题:
标签:重复执行 set cal 超时 一个 star cli 建立 不能
原文地址:https://www.cnblogs.com/hgzero/p/8963965.html