多线程实现tcp聊天服务器

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()

猜你喜欢

转载自www.cnblogs.com/hgzero/p/8963965.html