网络编程粘包问题(代码片段)

Talkischeap。 Talkischeap。     2022-11-13     188

关键词:

    首先说为什么会粘包,在py2上运行时,服务器把两次发送的操作强制的合成一次发送给客户端,所以 粘在一起了,因为python3的版本是可以的,但是有的时候python3也会出现粘包现象。

  解决粘包的问题有两种方法:

    1  可以先sleep一下,这个样子就可以使缓冲区超时,就不在等下一次的了,这样就可以和下一条命令隔离开了

    2  我在服务端来一个等待客户端确认,就ok了,这个确认不需要我们用户输入,而是客户端自动的给你来这个响应,就是说,客户端自动的写好代码,自动的给服务器一个响应,只要收到服务端的数据大小,我就立刻给服务器一个响应,就是在第一次send和第二次send之前插入一个交互,就能把数据分开了。

      下面也有两次send 的原因。

 

 

代码:中间空白分割的部分

#!usr/bin/env phthon3
# -*- coding:utf-8 -*-
# _Author_:"zhang Yaoqing"

import socket

client = socket.socket()
client.connect(("localhost", 9999))

while True:
    cmd = input(">>>:").strip()
    if len(cmd) == 0: continue
    client.send(cmd.encode("utf-8"))
    cmd_res_size = client.recv(500)  # 接收命令的长度
    print("命令结果大小:", cmd_res_size.decode())


    client.send(准备好了,可以发送了.encode(utf-8))       # 客户端已经确认。



    recevied_size = 0  # 接收客户端发来数据的计算器
    recevied_data = b‘‘  # 客户端每次发来内容的计数器
    while recevied_size < int(cmd_res_size.decode()):  # 当接收的数据大小 小于 客户端发来的数据
        cmd_res = client.recv(500)
        recevied_size += len(cmd_res)  # 每次收到的服务端的数据有可能小于1024,所以必须用len判断
        recevied_data += cmd_res
    else:
        print(recevied_data.decode("utf-8", "ignore"))
        print("cmd res receive done ....", recevied_size)

 

#!usr/bin/env phthon3
# -*- coding:utf-8 -*-
# _Author_:"zhang Yaoqing"

import socket, os

server = socket.socket()
server.bind(("localhost", 9999))
server.listen(5)
while True:
    conn, addr = server.accept()
    print("new addr:", addr)
    print(conn,conn)
    while True:
        data = conn.recv(500)
        if not data:
            print("客户端已断开")
            break
        print("执行指令:", data)
        cmd_res = os.popen(data.decode()).read()
        print("before send:", len(cmd_res))
        if len(cmd_res) == 0:
            cmd_res = "cmd has no output...."
        conn.send(str(len(cmd_res.encode())).encode())  # 发送服务端发送给客户端数据的长度


        client_ack = conn.recv(1024)  # 等待确认


        conn.send(cmd_res.encode("utf-8"))  # 发送服务端的数据
        print("send done")

 

网络编程——通信循环链接循环粘包问题(代码片段)

通信循环、链接循环、粘包问题一、通信循环服务端和客户端可以进行连续的信息交流fromsocketimport*ser_socket=socket(AF_INET,SOCK_STREAM)ser_socket.bind((‘127.0.0.1‘,8886))ser_socket.listen(5)conn,addr=ser_socket.accept()whileTrue:try:#抛出异常,若不抛 查看详情

网络编程之粘包(代码片段)

一、什么是粘包须知:只有TCP有粘包现象,UDP永远不会粘包粘包不一定会发生TCP发生粘包的两种情况:      1.由于Nagle算法,将多次间隔小且数量小的数据,合并成一个数据块      2.数据量发送大,接受少首先需... 查看详情

第六章-网络编程-粘包(代码片段)

1.粘包:多个包多个命令的结果粘到一起了因为recv1024限制了导致的结果参考:http://www.cnblogs.com/linhaifeng/articles/6129246.html粘包底层原理分析:1.运行一个软件和哪几个硬件有关硬盘内存cpu2.启动程序:硬盘程序加载到内存启一个软... 查看详情

tcp协议粘包问题详解(代码片段)

TCP协议粘包问题详解前言  在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题。本章主要介绍TCP粘包的原理与其三种解决粘包的方案。并且还会介绍为什么UDP协议不会产生粘包。 基于TCP协议的socket... 查看详情

使用newlife网络库管道模式解决数据粘包(代码片段)

...一个基本的Newlife网络服务端这边我们来讲一下如何解决粘包的问题在上一篇总我们注册了Newlife的管道处理器,我们来看看他是如何实现粘包处理的svr.Add<ReciveFilter>();//粘包处理管道首先看一下我们设备的上传数据协议 &n... 查看详情

socket编程(代码片段)

TCP下粘包问题两种情况下会发生粘包。1、发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包)发送方:AB  #其实放在缓存里没发送发送方:B  #其实放在缓存里没发... 查看详情

网络编程之粘包(代码片段)

粘包:传输层协议有tcp和udp两种tcp:TransmissionControlProtocol传输控制协议,基于数据流,收发的消息不能为空,需要在客户端和服务端都添加空消息的处理机制tcp是可靠性协议,数据的收发都需要确认信息,这就降低了传输效率,... 查看详情

java网络编程——粘包拆包出现的原因及解决方式(代码片段)

在基于TCP协议的网络编程中,不可避免地都会遇到粘包和拆包的问题。什么是粘包和拆包?先来看个例子,还是上篇文章《Java网络编程——NIO的阻塞IO模式、非阻塞IO模式、IO多路复用模式的使用》中“IO多路复用模式... 查看详情

java网络编程——粘包拆包出现的原因及解决方式(代码片段)

在基于TCP协议的网络编程中,不可避免地都会遇到粘包和拆包的问题。什么是粘包和拆包?先来看个例子,还是上篇文章《Java网络编程——NIO的阻塞IO模式、非阻塞IO模式、IO多路复用模式的使用》中“IO多路复用模式... 查看详情

网络编程基础粘包现象(代码片段)

粘包tcp是流式传输,字节流,数据与数据之间是没有边界的流式传输优点:不限定长度可靠传输缺点:慢和一个人的通信连接conn会一直占用我们的通信资源udp协议,面向数据包的传输数据包优点快由于不需要建立连接,所以谁... 查看详情

网络编程基础之粘包现象(代码片段)

一、粘包现象原理分析  1、我们先来看几行代码,从现象来分析:    测试程序分为两部分,分别是服务端和客户端    服务端.py 1#!/usr/bin/envpython32#-*-coding:utf-8-*-3#writebycongcong456importsocket78server=socket.socket(family=sock... 查看详情

粘包和拆包(代码片段)

写在前面粘包、拆包是Socket编程中最常遇见的一个问题,本文只对粘包、拆包现象及发生的原因做简要分析,具体如何解决粘包和拆包的问题,在后续文章中会详细介绍。什么是粘包、拆包TCP是个"流"协议,所谓流,就是没有界... 查看详情

12.netty中tcp粘包拆包问题及解决方法(代码片段)

...文源代码总结自B站《netty-尚硅谷》;2.本文介绍了tcp粘包拆包问题;3.本文po出了粘包拆包问题解决方案及源代码实现;【1】tcp粘包拆包问题refer2HowtodealwiththeproblemofpacketstickingandunpackingduringTCPtransmission?-编程知识【1.1... 查看详情

12.netty中tcp粘包拆包问题及解决方法(代码片段)

...文源代码总结自B站《netty-尚硅谷》;2.本文介绍了tcp粘包拆包问题;3.本文po出了粘包拆包问题解决方案及源代码实现;【1】tcp粘包拆包问题refer2HowtodealwiththeproblemofpacketstickingandunpackingduringTCPtransmission?-编程知识【1.1... 查看详情

socket网络编程之粘包问题详解(代码片段)

一,粘包问题详情1,只有TCP有粘包现象,UDP永远不会粘包   你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用户态co... 查看详情

netty4.xnettytcp粘包/拆包问题的解决办法(代码片段)

...与Netty服务器的网络通信(一)[[toc]]目录[[toc]]一、什么是TCP粘包/拆包二、重现TCP粘包  2.1代码示例(服务器端)  2.2代码示例(客户端)  2.3控制台(客户端)  2.4粘包问题的解决办法  2.5代码修改(服务器端)  2.6代码修改&... 查看详情

网络编程ssh,粘包(代码片段)

1.什么是socket?TCP,可靠地,面向连接协议,有阻塞rect udp,不可靠的,无线连接的服务这里因为不需要阻塞,所以速度会很快,但安全性不高2.关于客户端退出而服务器未退出的解决办法1importsocket2sock=socket.socket()#TCP协议3IP_PORT=("127.0.0.1"... 查看详情

tcp粘包问题分析和解决(全)(代码片段)

源于:https://blog.csdn.net/wuxing26jiayou/article/details/79730987在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的。因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端... 查看详情