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