1 from socket import *
2
3
4 def main():
5 # 1.创建tcp_server_socket 套接字对象,用于监听客户端的请求
6 tcp_server_socket = socket(AF_INET,SOCK_STREAM)
7
8 # 复用同一个端口而不会提示端口被占用 ,解决当关闭的socket当处于time_out状态时, 也可立即使用端口
9 """
10 socket.setsockopt(level,option,value) :配置socket
11 level:等级,对哪个等级操作(ip,tcp,udp,socket等级)
12 option:设置哪个选项
13 socket.SO_REUSEADDR: 复用地址
14 value: True:表示复用,False,表示不复用
15 """
16 tcp_server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,True)
17 # 提示:socket.setsockopt()方法要在 socket.bind()之前设置
18
19 # 2.绑定端口
20 tcp_server_socket.bind((\'\',9999))
21
22 # 3. tcp_server_socket开始监听,有主动连接模式变为被动连接模式
23 tcp_server_socket.listen(5)
24
25 # 4.等待客户端的请求,一有连接,就创建一个与客户端对接的new_socket新套接字,并且用这个新关键字与客户端联系
26 while True:
27 new_socket,client_addr = tcp_server_socket.accept()
28 print("新客户端连接:" ,client_addr)
29 new_socket.send("欢迎使用".encode())
30
31 # 5.使用新创建的new_socket来与客户端通信
32 # 此处的while True为同一客户端提供多次服务
33 while True:
34 recv_data = new_socket.recv(1024)
35
36 if recv_data:
37 print("新消息:%s,来自:%s"%(recv_data.decode(\'gbk\'),client_addr))
38
39 # 给客户端返回消息
40 new_socket.send("再见".encode())
41
42 else:
43 print(\'对方已经下线\')
44 break
45
46 # 6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信
47 new_socket.close()
48
49 # 7.server_socket关闭,则不再接收新的客户端请求
50 tcp_server_socket.close()
51
52
53 if __name__ == \'__main__\':
54 main()