学习笔记---用非堵塞实现单进程单线程处理客户端

代码不重要,主要是思想 流程

import socket


tcp_server_tcp = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
tcp_server_tcp.setblocking(False)#设置套接字为非堵塞的方式 放在bind和listen前面
tcp_server_tcp.bind(('', 6789)) #绑定IP  端口port
tcp_server_tcp.listen(128)  #监听

client_socket_list = list( )

while True:

	try:#有客户端到来就不发生异常
	    new_socket, new_addr = tcp_server_tcp.accept()  #来了一个新客户端
	except Exception as ret :#没有客户端到来,设置了不堵塞,程序会发生异常
		# print('问题是', ret)
		# raise StopIteration
		pass
	else:# 没有异常,意味着有新客户端到来
		new_socket.setblocking(False)#设置间接套接字为非堵塞的方式
		client_socket_list.append(new_socket) #将套接字存放在列表中
	
	#当接收到客户端数据,list中就不是空的,就会运行下面的for
	for client_socket in client_socket_list:

		try:
			recv_data = client_socket.recv(1024)#接收每一个客户端发过来的数据
		except Exception as ret:#如果客户端没有发来数据,捕获错误
			# raise StopIteration
			pass
		else:#当收到一个客户端的数据,(可能是对放调用close,可能是有效数据)
		#recv_data有数据,但是返回值是空的  说明调用了close,下面判断这种情况
			if recv_data:#有有效数据
				print('数据有效')
			else:
				#对方调用了close, 导致recv返回
				client_socket.close()
				client_socket_list.remove(client_socket)#删除list中已经过时的套接字
				#同时关闭这个套接字
	

你可能感兴趣的:(Python)