from socket import *
from threading import Thread
def main():
#必须参数
server_socket = socket(AF_INET,SOCK_STREAM)
#以免万一是服务器首先发出四次挥手就要等待2SML,防止地址没有被释放
server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
server_socket.bind(('',6628))
server_socket.listen(5)
try:
while True:
print ('等待客户端的到来')
new_socket, client_addr = server_socket.accept()
print ('为新来的客户端(%s)创建一个线程服务'%str(client_addr))
print ()
client_thread = Thread(target=serve_client_thread,args=(new_socket,client_addr))
client_thread.start()
#client_thread.join()
#join不能有!为什么?
#因为如果有类join()那么主线程必须等待这个子线程执行完毕之后才能继续回去执行while循环
#结果就是第一个客户端如果一直不结束,后面来的其他客户端就不能正常 与服务器通信
#最终这就相当于单线程的服务器,根本没用到多线程的优点!!!!
#自己去试一试 会有更深刻的体验!!!!!!不懂就去运行 从结果分析~~~
#new_socket.close()
# 线程中由于共用一个socket所以这里不能写这句不然之后的客户端请求也就无法继续进行了
# 进程中是不共用的所以不用注释掉这句话!!!
# 那为什么不用多进程而是用多线程呢?应为进程占的资源大啊~~~~~
finally:
server_socket.close()
def serve_client_thread(new_socket, client_addr):
while True:
recv_info = new_socket.recv(1024)
if len(recv_info.decode('gb2312')) > 0:
print ('client_addr:%s,recv_Info:%s'%(str(client_addr),recv_info.decode('gb2312')))
else:
print ('客户端%s关闭~'%str(client_addr))
new_socket.close()
break
if __name__ == '__main__':
main()
多线程/进程tcp服务器代码的书写01版本
最新推荐文章于 2022-09-04 15:20:03 发布