10、网络编程-tcp服务器-循环为多个客户端服务(2)

cp 05-tcp服务器.py 06-循环为多个客户端服务.py

举例:去银行办业务,先取号,到了号之后去办理业务

思路:
将accept返回的新套接字的部分进行while True,然后对打印的内容进行格式化。
注意事项:
recv返回的仅仅是内容,打印时需要进行解码;recvfrom返回的是内容和addr

监听套接字不能放到while True里面,否则就会造成监听套接字关闭,不能等待新的客户端到来,即XXXX.accept失败;

关闭accept返回的套接字即new_client_socket,意味着不再为这个客户服务

import socket

def main():
	#1、买手机(创建套接字)
	tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	
	#2、插手机卡(绑定 bind ip port)
	tcp_server_socket.bind(("",7890))
	
	#3、设置成响铃状态(将套接字由主动变为被动 listen)
	tcp_server_socket.listen(128)
	
	while True:
		print("等待一个新的客户端到来。。。")
		#4、等待别人打进来(等待客户链接 accept)
		new_client_socket,client_addr = tcp_server_socket.accept()
		#在终端中测试时,只要看到下面这句话,说明已经解阻塞
		print("一个新的客户端已经到来:s%" % str(client_addr))
		
		#5、接收客户端发过来的请求
		recv_data = new_client_socket.recv(1024)
		print("客户端发送过来的请求是:s%" % recv_data.decode("utf-8"))
		
		#6、给客户端发送数据
		new_client_socket.send("hahahh".encode("utf-8"))
	
		#7、关闭套接字
		new_client_socket.close()
		print("已经服务完毕。。。")

	tcp_server_socket.close()
	
if __name__ == "__main__":
main()

以上程序的存在的问题:
一个客户端每次只能解决一个问题,如果还有其他问题,没有服务完呢?

cp 06-循环为多个客户端服务.py 07-循环为多个客户端服务并且多次服务一个客户端.py

vim 07-循环为多个客户端服务并且多次服务一个客户端.py

思路:
解决完一个问一下还有什么需要服务的,然后循环问,不知道循环几次用while
True,接收客户端发送来的消息和回送客户端消息放在循环体内;
外面的while True循环为多个客户端服务,里面的while True循环为一个客户服务多次

import socket

def main():
	#1、买手机(创建套接字)
	tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	
	#2、插手机卡(绑定 bind ip port)
	tcp_server_socket.bind(("",7890))
	
	#3、设置成响铃状态(将套接字由主动变为被动 listen)
	tcp_server_socket.listen(128)
	
	while True:
		print("等待一个新的客户端到来。。。")
		#4、等待别人打进来(等待客户链接 accept)
		new_client_socket,client_addr = tcp_server_socket.accept()
		#在终端中测试时,只要看到下面这句话,说明已经解阻塞
		print("一个新的客户端已经到来:s%" % str(client_addr))
		
		while True:
			#5、接收客户端发过来的请求
			recv_data = new_client_socket.recv(1024)
			print("客户端发送过来的请求是:s%" % recv_data.decode("utf-8"))
			
			#6、给客户端发送数据
			new_client_socket.send("hahahh".encode("utf-8"))
	
		#7、关闭套接字
		new_client_socket.close()
		print("已经服务完毕。。。")

	tcp_server_socket.close()
	
if __name__ == "__main__":
main()

以上程序出现的新问题:如何知道一个客户端不再需要服务了?用if else

思路:
重点是if条件如何写?不再需要服务一般就是客户端关闭窗口,recv解阻塞,解阻塞有两种,一种是recv_data为空,一种不为空客户端发送数据过来了

if条件:
.
不仅可以写大于小于 等于,还可以直接跟数字 元组 列表 字典 集合 小数点,前提是数字不是0,列表 元组 字典不是空,条件就成立。
.
if none 条件是不成立的,if true条件成立,if false条件不成立
.
以上条件判断可在ipython3交互模式下进行测试知识点。
.
#recv_data是一个字符串,if recv_data表示如果字符串不为空,if not recv_data表示字符串为空时的条件

import socket

def main():
	#1、买手机(创建套接字)
	tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	
	#2、插手机卡(绑定 bind ip port)
	tcp_server_socket.bind(("",7890))
	
	#3、设置成响铃状态(将套接字由主动变为被动 listen)
	tcp_server_socket.listen(128)
	
	while True:
		print("等待一个新的客户端到来。。。")
		#4、等待别人打进来(等待客户链接 accept)
		new_client_socket,client_addr = tcp_server_socket.accept()
		#在终端中测试时,只要看到下面这句话,说明已经解阻塞
		print("一个新的客户端已经到来:s%" % str(client_addr))
		
		while True:
			#5、接收客户端发过来的请求
			recv_data = new_client_socket.recv(1024)
			print("客户端发送过来的请求是:s%" % recv_data.decode("utf-8"))

			#如果recv解阻塞,那么有两种方式:
			#1、客户端发送过来数据
			#2、客户端调用close关闭了窗口
			#recv_data是一个字符串,if recv_data表示如果字符串不为空
			if recv_data:
				#6、给客户端发送数据
				new_client_socket.send("hahahh".encode("utf-8"))
			else:
				break
	
		#7、关闭套接字
		new_client_socket.close()
		print("已经服务完毕。。。")

	tcp_server_socket.close()
	
if __name__ == "__main__":
main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值