解决缓存不够无法接收全部数据和粘包问题
server程序如下:
import socket
sk=socket.socket()
print(sk)
address=(‘127.0.0.1‘,8888)
sk.bind(address)
sk.listen(3)
‘‘‘
服务器端不关闭,客户端输入exit后关闭,服务器接收下一个连接的内容,进行对话
‘‘‘
#方法一
# conn,addr=sk.accept()
# print(conn)
# while True:
# data=conn.recv(1024)
# if str(data,‘utf8‘)==‘‘:
# conn,addr=sk.accept()
# print(addr)
# continue
# print(str(data,‘utf8‘))
# ssData=input(‘>>>‘)
# conn.send(bytes(ssData,‘utf8‘))
#方法二
import subprocess
while True:
conn, addr = sk.accept()
while True:
try: #此时使用try是为了防止对方发送空字段信息
data = conn.recv(1024)
process=subprocess.Popen(str(data,‘utf8‘),shell=True,stdout=subprocess.PIPE)
print(process)
std_result=process.stdout.read()
#print(std_result)
length=len(std_result)
# std_result=str(length)+‘|‘+str(std_result,‘utf8‘)
except Exception as e:
break
if str(data, ‘utf8‘) == ‘‘:
break
conn.sendall(bytes(str(length),‘utf8‘))
#两个send在一起会发生粘包现象,此时只需要在两个send之间进行短暂停留,可以用time.sleep方法
#也可以用conn.recv(),推荐使用这一种,此时需要修改客户端,客户端需要发送一个数据
conn.recv(1024)
conn.sendall(std_result)
#conn.send(bytes(std_result,‘utf8‘))client端代码如下:
import socket
sk2=socket.socket()
address=(‘127.0.0.1‘,8888)
sk2.connect(address)
print(sk2)
while True:
cdata=input(‘>>>‘)
if cdata==‘exit‘:
break
sk2.send(bytes(cdata,‘utf8‘))
crdata=int(str(sk2.recv(1024),‘utf8‘))
#对应服务端的recv此时需要发送一个数据,可以是任意数据
sk2.send(bytes(‘ok‘,‘utf8‘))
# print(crdata)
#生成一个空的bytes类型的数据,用于组合接收到的数据
#在接收数据,设置缓存大小的时候,因为不知道对方发送过来的数据大小,一般设置为8K,但是当对方
#发送过来的数据大于这个值的时候,缓存无法全部接收,因此需要进行判断,在服务器端发送数据时,发送
#一个数字是数据的大小,客户端接收数据的时候通过这个数字来判断是否接收完成,通过循环,反复接收
data=bytes()
while True:
data += sk2.recv(512)
if len(data)==crdata:
break
print(len(data))
#此时输出两个数据类型,是因为原来传输过来的crdata是bytes类型,二len(data)是int型
#因此在上面需要对bytes转换成int,而byte不能直接转成int,需要通过str进行中转
print(type(len(data)))
print(type(crdata))
print(str(data,‘gbk‘))
sk2.close()