Python3.6:socket数据传输解决粘包问题valueerror:invalid literal for int() with base 10:

在上一篇socket实现简单ssh客户端中,有的时候会出现这个错误


这是因为长度和字符串一起发送了,长度在转整形的时候里面包含了字符串所出现的错误,这是由于数据传输过程中出现粘包导致的,两条send语句紧挨着,导致数据一起发送过去了

两个send语句紧挨:

    # 发送返回值长度
    conn.send(str(len(response.encode())).encode())  # len里面的response也要加一个.encode()
    
    # 发送返回值
    conn.send(response.encode())

那我们应该如何避免这种情况的发生呢?
可以看到,一共发送两次数据,我们可以在第一次发送数据是让客户端随便返回一些数据,然后让服务器在第一次发送完数据之后接受一次数据当作第一次数据发送成功的确认,也就是:

1.在客户端第一次接收到数据大小之后立刻给服务器发送一次任意简短数据当作确认信息
2.在服务器发送完第一次数据之后等待收取一次确认信息,收到确认信息后再进行第二次的数据发送

服务器端

import socket
import os

# 生成socket实例
server = socket.socket()

# 绑定端口
server.bind(('localhost', 6969))

# 监听端口
server.listen()

# 等待链接
conn, addr = server.accept()

# 进入循环
while True:

    print('等待指令')

    # 接收指令
    data = conn.recv(1024)

    # 判断data是否存在
    if not data:
        print('断开')
        break

    # os模块获取指令
    response = os.popen(data.decode()).read()  # 获得返回 接受字符串,返回结果也是字符串

    # popen无法获得错误返回值,所以加一步判断
    if len(response) == 0:
        response = 'Error'

    # 发送返回值长度
    conn.send(str(len(response)).encode())  # 如果在win下len里面的response就必须也要加一个encode()

    # 放置粘包
    conn.recv(1024)

    # 发送返回值
    conn.send(response.encode())

    print('send done')

server.close()

客户端

import socket

# 生成socket实例
client = socket.socket()

# 链接指定ip端口
client.connect(('localhost', 6969))

# 进入循环
while True:

    # 获得指令
    cmd = input('请输入指令:').strip()

    # 指令为空继续等待输入
    if len(cmd) == 0:
        continue

    # 发送指令
    client.send(cmd.encode())

    # 获得返回值长度
    res_size = client.recv(1024).decode()

    # 发送确认收到信息,防治粘包
    client.send(b'111')

    print(res_size)

    # 字符串转整型
    i_res_size = int(res_size)

    # 一次收1024,判断收多少次,每收一次用总长度减去收到的长度,只要剩余长度大于0就一直收
    while i_res_size > 0:

        # 收取返回值,这里虽然写的1024但是每次收的有可能小于1024
        data = client.recv(1024)

        # 减去这一次收取的长度
        i_res_size -= len(data)  # 这里不能-1024 因为recv不一定每次都收1024 有可能小于1024

        # 打印返回值
        print(data.decode())

    # 假如剩余长度小于等于0了说明收完了
    else:

        # 打印收取返回值的总长度
        print('response recv done...', res_size)

客户端服务器端各加一行,就能有效的避免粘包的出现,粘包的情况会在数据传输中经常出现,所以要记住这个方法

转载请注明出处

python自学技术互助扣扣群:670402334

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容