黏包现象之TCP

老师的博客: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都可以正常的运行。

但是我还是不知道原因是什么,难带排序错误了?

原文地址:https://www.cnblogs.com/accolade/p/10532685.html