老师的博客: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都可以正常的运行。
但是我还是不知道原因是什么,难带排序错误了?