老师的博客:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label5
server
#_*_coding:gbk*_ from socket import * import subprocess ip_port=('192.168.43.155',8888) BUFSIZE=1024 tcp_socket_server=socket(AF_INET,SOCK_STREAM) tcp_socket_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) tcp_socket_server.bind(ip_port) tcp_socket_server.listen(1) while True: conn,addr=tcp_socket_server.accept() print('客户端',addr) while True:
cmd=conn.recv(BUFSIZE) print(cmd.decode('gbk')) if len(cmd) == 0:break res=subprocess.Popen(cmd.decode('gbk'),shell=True,bufsize=1, stdout=subprocess.PIPE, #标准输出 stdin=subprocess.PIPE,#标准输入 stderr=subprocess.PIPE) #标准错误 stderr=res.stderr.read() print(stderr) stdout=res.stdout.read() print(stderr) conn.send(stderr) conn.send(stdout) conn.close()
client
#_*_coding:gbk*_ import socket BUFSIZE=10240 ip_port=('192.168.43.155',8888) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect_ex(ip_port) while True: msg=input('>>: ').strip() if len(msg) == 0:continue if msg == 'quit':break s.send(msg.encode('gbk')) act_res=s.recv(BUFSIZE) print(act_res.decode('gbk'),end='')
不知道怎么回事。clientd端运行 ipconfig/all , python 这样的文件时收不到返回值,而随便输入的错误的代码却能够正常的返回错误的的信息。
找到原因了
原因是因为TCP的算法优化,出现了黏包现象,当我两次发送的字节没有1024时候,由于算法的优化,所以一次接受了,然后第二次就没有东西可以接受了,就一直等待然后就开在哪里,把接受方的改为以一次接受就好。
PIPE相当队列和迭代器只能用一次。
但是新的问题又来了,下面请看代码
server
import socket import subprocess server=socket.socket() ip_port=('192.168.43.155',8890) server.bind(ip_port) server.listen() client,address=server.accept() while 1: ret= client.recv(1024).decode('gbk') if ret=='bye':break get= subprocess.Popen(ret,shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) get_out=get.stdout.read()#默认gbk get_err=get.stderr.read() client.send(get_out) print(get_out) client.send(get_err) print(get_err) server.close()
client
import socket client=socket.socket() ip_port=('192.168.43.155',8890) client.connect(ip_port) while 1: conformation=bytes(input('<<:').encode('gbk')) if conformation=='bye':break client.send(conformation) message=client.recv(1024).decode('gbk') # message2=client.recv(1024).decode('gbk')#不能这么写,因为接受了大约两条信息,如果前面发送 # 信息小于1024,便会一直等待,结果便会一直等带接受消息,而server端又没有发送消息,便会一直等待, # 不会执行后面的代码而卡在这里 print('server out:',message) client.close()
在执行代码时,竟然出现编码错误的现象,不知道是怎么回事,在接受方出现以下报错
UnicodeDecodeError: 'gbk' codec can't decode byte 0xd2 in position 1023: incomplete multibyte sequence
按理说:windows的cmd的默认编码方式就是jbk 但是再接解码的时候1023个字节竟然出下了报错,意思是gbk解码方式尽然不能解码。我也不知道为什么。
现在知道了解决方法,就是把1024改为2048或者4096都可以正常的运行。
但是我还是不知道原因是什么,难带排序错误了?