zoukankan      html  css  js  c++  java
  • TCP协议的粘包现象和解决方法

    # 粘包现象

    # server
    import socket

    sk = socket.socket()
    sk.bind(('127.0.0.1', 8005))
    sk.listen()

    conn, addr = sk.accept()
    conn.send(b'123')
    conn.send(b'123')

    # client
    import time
    import socket

    sk = socket.socket()

    sk.connect(('127.0.0.1', 8005))

    time.sleep(5)
    msg1 = sk.recv(1024).decode('utf-8')
    msg2 = sk.recv(1024).decode('utf-8')
    print(msg1)
    print(msg2)

    # 客户端接收到的信息,两条黏在了一起
    # 123123
    #
    # 这就是粘包现象

    解决方法:

    # 利用struct模块
    # server
    import struct
    import socket

    sk = socket.socket()
    sk.bind(('127.0.0.1', 8005))
    sk.listen()

    def func(msg):
    msg = msg
    len_msg = len(msg)
    struct_msg = struct.pack('i', len_msg)
    conn.send(struct_msg)
    conn.send(msg)

    conn, addr = sk.accept()


    msg1 = '这是第一条信息'.encode('utf-8')
    msg2 = '这是第二条信息'.encode('utf-8')

    func(msg1)
    func(msg2)


    # client
    import struct
    import socket
    import time

    sk = socket.socket()
    sk.connect(('127.0.0.1', 8005))

    time.sleep(10)

    def func(sk):
    struct_msg = sk.recv(4)
    struct_msg = struct.unpack('i', struct_msg)[0]
    msg = sk.recv(int(struct_msg)).decode('utf-8')
    return msg

    print(func(sk))
    print(func(sk))

  • 相关阅读:
    性能测试之数据准备
    工作笔记
    Ruby on Rails 模型关联(多对多关系)
    oracle 分页查询优化
    mysql命令学习
    mysql 导入导出
    aix 管理网卡
    dataguard没成功创建数据文件
    aix删除网卡
    oracle rac 随笔
  • 原文地址:https://www.cnblogs.com/xuyuwei/p/11536668.html
Copyright © 2011-2022 走看看