一、简单的socket程序——传输简短文字:

# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import socket whw_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
whw_client.connect(('127.0.0.1',9001))
while 1:
cmd = input('>>>:').strip()
if not cmd:
continue
whw_client.send(cmd.encode('utf-8'))
recv_data = whw_client.recv(1024)
data = recv_data.decode('utf-8')
print('server data:',data)

client

# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import socket whw_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
whw_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
whw_server.bind(('127.0.0.1',9001))
whw_server.listen(5)
print('listening......')
conn,addr = whw_server.accept()
#通信循环
while 1:
try:
recv_data = conn.recv(1024)
data = recv_data.decode('utf-8')
print('client data:',data)
conn.send(data.swapcase().encode('utf-8'))
except ConnectionResetError:
break
conn.close()

server

  演示如下:

二、模拟SSH命令——解决粘包问题版:

  关于粘包问题的解决方案:

  在服务器端,由于解析出来的命令结果非常多,所以我们在发送结果之前需要先给客户端发送一个“报文”,这个报文保存着具体的命令结果的信息——其中关键的信息就是结果的长度,客户端只有知道这个结果的长度后,才能制定相应的接收规则:

# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import socket
import json
import struct whw_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
whw_client.connect(('127.0.0.1',9000))
while 1:
try:
cmd = input('>>>:').strip()
if not cmd:
continue
#发命令
whw_client.send(cmd.encode('utf-8'))
#1.收报头长度
obj = whw_client.recv(10)
#注意structunpack出来的[0]值为长度信息
header_size = struct.unpack('i',obj)[0]
#2.收报头——根据报头长度来收
header_bytes = whw_client.recv(header_size)
#3.从报头中解析出'total_size'
header_json = header_bytes.decode('utf-8')
header_dic = json.loads(header_json)
total_size = header_dic['total_size']
#根据total_size开始接收真实的数据
recv_size = 0
recv_data = b''
while recv_size < total_size:
res = whw_client.recv(1024)
recv_data += res
recv_size += len(res)
print('命令结果:\n',recv_data.decode('gbk'))
except Exception as e:
whw_client.close()

client

# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import socket
import subprocess
import json
import struct whw_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
whw_server.bind(('127.0.0.1',9000))
whw_server.listen(5)
print('Listening......')
conn,addr = whw_server.accept()
while 1:
try:
#收命令
cmd_recv = conn.recv(1024).decode('utf-8')
#解析命令
obj = subprocess.Popen(cmd_recv,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
#将命令返回给客户端
#1.制作固定报头——注意报头里面要包含数据的总长度!
header_dic = {'filename':'whw','total_size':len(stdout)+len(stderr)}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8')
#2.发送报头长度——struct:把数字打成固定长度
conn.send(struct.pack('i',len(header_bytes)))
#3.发送报头
conn.send(header_bytes)
#4.发送真实数据
conn.send(stdout)
conn.send(stderr)
except ConnectionResetError:
break conn.close()

server

  演示如下:

Socket传输简单的信息以及粘包问题的解决的更多相关文章

  1. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  2. DELPHI高性能大容量SOCKET并发(四):粘包、分包、解包

    粘包 使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾.粘包可能由发送方造成,也可能由接收方造成.TCP为提 ...

  3. C#高性能大容量SOCKET并发(五):粘包、分包、解包

    原文:C#高性能大容量SOCKET并发(五):粘包.分包.解包 粘包 使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一 ...

  4. 什么是TCP粘包?怎么解决这个问题

    在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接.在TCP的socket编程中,发送端和接收端都有成对的socke ...

  5. 网络编程----粘包以及粘包问题的解决、FTP上传

    一.粘包现象 让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig) 注意注意: res=subprocess.Popen(cmd.decode('u ...

  6. python 粘包问题及解决方法

    一粘包 TCP协议是面向对象的,面向流的,提高可靠性服务.使用了优化算法,Nagle算法.将多次间隔较少且数据量小的数据,合并成一个大的数据块,然后进行封包.这样接收端就很难分辨出来.TCP协议数据是 ...

  7. socket粘包现象加解决办法

    socket粘包现象分析与解决方案 简单远程执行命令程序开发(内容回顾) res = subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=su ...

  8. Socket编程(4)TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

  9. 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

    TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...

随机推荐

  1. Java中break和continue跳出指定循环

    https://www.cnblogs.com/miys/p/b7f6a463bc58785d74a8a7fccd1f1243.html 在Java中,break和continue可以跳出指定循环,在 ...

  2. gxx -L和/etc/ld.so.conf的理解

    编程之路刚刚开始,错误难免,希望大家能够指出. 今天编了个动态库,然后自己测试了一下. 忘记设置程序运行时系统搜索库的路径发生错误: 忘记设置程序编译的时候 -L 指定路径报的错误: -L : 告诉程 ...

  3. LG4091 【[HEOI2016/TJOI2016]求和】

    前置:第二类斯特林数 表示把\(n\)个小球放入\(m\)个不可区分的盒子的方案数 使用容斥原理分析,假设盒子可区分枚举至少有几个盒子为空,得到通项: \[S(n,m)=\frac{1}{m!}\su ...

  4. day08 MapReduce

    PS: HDFS对于MapReduce来说,HDFS就是一个就是一个客户端. PS: 离线就是 写sql,sparkh还是写sql 1. MAPREDUCE原理篇(1) Mapreduce是一个分布式 ...

  5. jdk1.9之前的版本及jdk1.9环境变量的配置

    一.jdk9之前安装配置 1.下载jdk:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.配置环境变量: 安装 ...

  6. 数据格式转换(一)PDF转换技术

         PDF(Portable Document Format)文件格式是Adobe公司开发的电子文件格式. 这样的文件格式与操作系统平台无关.这一特点使它成为在Internet上进行电子文档发行 ...

  7. 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字

    思路:所求和为一个数字的前n项和,例如前4项和就是从4+44+444+4444,一直加到第4位,为4个4.所以可以用一个循环来表示每一项的数字,加到前几项就循环几次.然后将每项进行相加就可以求出总和. ...

  8. LoadRunner内部介绍以及常见问题

    Tools Recording Options 接下来我们挨个看一下里面的东东以及区别 General(通常的) Script,不用修改,是脚本的语言,我们一般都是基于 C 语言的 Protocols ...

  9. spring+mybaits xml配置解析----转

    一.项目中spring+mybaits xml配置解析 一般我们会在datasource.xml中进行如下配置,但是其中每个配置项原理和用途是什么,并不是那么清楚,如果不清楚的话,在使用时候就很有可能 ...

  10. php 过滤器filter_var验证邮箱/url/ip等

    验证邮箱.url或者ip,除了使用正则外,也可以使用内置的函数库过滤器filter来完成这些功能. filter_var (PHP 5 >= 5.2.0, PHP 7)filter_var — ...