标签:list cal not 阻塞 stdout 大小 通信 pytho .com
网络通信 socket
这一节太难了,还是看TA的吧
http://www.cnblogs.com/alex3714/articles/5830365.html
在开始解决上面问题3之前,我们要考虑,客户端要循环接收服务器端的大量数据返回直到一条命令的结果全部返回为止, 但问题是客户端知道服务器端返回的数据有多大么?答案是不知道,那既然不知道服务器的要返回多大的数据,那客户端怎么知道要循环接收多少次呢?答案是不知道,擦,那咋办? 总不能靠猜吧?呵呵。。。 当然不能,那只能让服务器在发送数据之前主动告诉客户端,要发送多少数据给客户端,然后再开始发送数据,yes, 机智如我,搞起。
先简单测试接收数据量大小
1 import socket 2 import os,subprocess 3 4 5 server = socket.socket() #获得socket实例 6 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 7 8 server.bind(("localhost",9998)) #绑定ip port 9 server.listen() #开始监听 10 11 while True: #第一层loop 12 print("等待客户端的连接...") 13 conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来... 14 print("新连接:",addr ) 15 while True: 16 17 data = conn.recv(1024) 18 if not data: 19 print("客户端断开了...") 20 break #这里断开就会再次回到第一次外层的loop 21 print("收到命令:",data) 22 #res = os.popen(data.decode()).read() #py3 里socket发送的只有bytes,os.popen又只能接受str,所以要decode一下 23 res = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE).stdout.read() #跟上面那条命令的效果是一样的 24 if len(res) == 0: 25 res = "cmd exec success,has not output!" 26 conn.send(str(len(res)).endcode("utf-8")) #发送数据之前,先告诉客户端要发多少数据给它 27 conn.sendall(res.encode("utf-8")) #发送端也有最大数据量限制,所以这里用sendall,相当于重复循环调用conn.send,直至数据发送完毕 28
29 server.close()
import socket client = socket.socket() client.connect(("localhost",9998)) while True: msg = input(">>:").strip() if len(msg) == 0:continue client.send( msg.encode("utf-8") ) res_return_size = client.recv(1024) #接收这条命令执行结果的大小 print("getting cmd result , ", res_return_size) total_rece_size = int(res_return_size) print(total_rece_size) #print(data.decode()) #命令执行结果 client.close()
标签:list cal not 阻塞 stdout 大小 通信 pytho .com
原文地址:http://www.cnblogs.com/otcsnow/p/6486569.html