解决缓存不够无法接收全部数据和粘包问题
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()