zoukankan      html  css  js  c++  java
  • 黏包现象之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都可以正常的运行。

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

  • 相关阅读:
    模糊查询与索引
    weblogic 域的创建
    undo表空间缩小
    weblogic安装
    C#学习笔记——枚举类型
    C#学习笔记——windows窗体
    Qt之主窗口设计——打印图像
    C#学习笔记——MDI窗体(多文档界面)
    C#学习笔记——抽象类和抽象方法
    C#学习笔记——Main方法
  • 原文地址:https://www.cnblogs.com/accolade/p/10532685.html
Copyright © 2011-2022 走看看