程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

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

发布于2019-08-21 14:58     阅读(396)     评论(0)     点赞(30)     收藏(1)


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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

以上程序出现的新问题:如何知道一个客户端不再需要服务了?用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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43


所属网站分类: 技术文章 > 博客

作者:343ueru

链接:https://www.pythonheidong.com/blog/article/50531/7de449502c247503793f/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)