CSIC_716_20191203【 socket网络编程,以及沾包问题的高级解决方式】
- AF_UNIX(本机通信)
- AF_INET(TCP/IP – IPv4)
- AF_INET6(TCP/IP – IPv6)
- SOCK_STREAM(TCP流)
- SOCK_DGRAM(UDP数据报)
远程操作服务端的命令行。
解决沾包问题的方法: 以远程连接服务端的命令行为例子。
server服务端
# _*_ coding: gbk _*_
# @Author: Wonder
import socket
import json
import subprocess
import struct # 将数字类型变成固定长度,
from socket import SOL_SOCKET, SO_REUSEADDR sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # 重用地址 sk.bind(('127.0.0.1', 9900)) # 绑定地址和端口号 ,这里ip和端口组成一个元组
sk.listen(5) # 启动监听,允许最大连接数量为3
while True:
sock, addr = sk.accept() # 三次握手建立的管道,支持多个客户端client进行连接
while True:
try:
bin_cmd = sock.recv(1024) # 二进制, 接收二进制的cmd
cmd = bin_cmd.decode('utf-8') # 转成真是的cmd
sub_obj = subprocess.Popen(cmd, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE) # 操作本机cmd
stdout = sub_obj.stdout.read() # 系统生成的二进制,windows环境下是gbk编码格式,Linux下是utf-8格式。
stderr = sub_obj.stderr.read()
'''
高级版本在于改造报头
'''
head_content = {
'filename': 'kazami.txt',
'secreatkey': 123456,
'header': len(stdout) + len(stderr)
}
head_text = json.dumps(head_content).encode('utf-8') # 序列化之后进行编码 sock.send(struct.pack('i', len(head_text))) # 发报头长度
sock.send(head_text) # 发报头 sock.send(stdout)
sock.send(stderr)
# sock.send(str2.encode('utf-8'))
except ConnectionResetError: # 当判断client断开连接后,跳出循环
break sock.close() sk.close()
client 客户端
# _*_ coding: gbk _*_
# @Author: Wonder
import socket
import struct
import json sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 和 Internet中的通信,流格式。
sk.connect(('127.0.0.1', 9900)) # 连接到服务端的绑定地址
while True:
cmd = input('>>>').strip()
if not cmd:
continue
sk.send(cmd.encode('utf-8')) # 必须要发送二进制的数据。
res1 = sk.recv(4) #取报头长度
text_text_len = struct.unpack('i', res1)[0] # 获取报头的真实长度
bin_head_text = sk.recv(text_text_len) # 读取报头内容
head_text =json.loads(bin_head_text.decode('utf-8')) print(head_text) data_size = head_text.get('header') # 真实内容长度 res_byt = b''
real_size = 0
while real_size < data_size: #当真实拼接的长度小于数据长度时,不断拼接,直到完整数据拼出来。
res = sk.recv(4444) # 最大为缓存,过大没有意义。
res_byt += res
real_size += len(res)
print(res_byt.decode('gbk'))
print(real_size)
sk.close()
CSIC_716_20191203【 socket网络编程,以及沾包问题的高级解决方式】的更多相关文章
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- python之Socket网络编程
什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- Socket网络编程-基础篇
Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...
- Socket网络编程--FTP客户端
Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...
- windows下的socket网络编程
windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...
- windows下的socket网络编程(入门级)
windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...
随机推荐
- MyBatis操作数据库(基本增删改查)
一.准备所需工具(jar包和数据库驱动) 网上搜索下载就可以 二.新建一个Java project 1.将下载好的包导入项目中,build path 2.编写MyBatis配置文件:主要填写prope ...
- JAVA设计模式之迭代器设计模式
一.迭代器模式简介 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式. 二.迭代器模式的角色与职 ...
- js正则删除字符串中的部分内容
// 例如 let a = `(ID)444` a.replace(/\(ID\)/ig, '') // 结果 "444"
- web自动化框架抽取示例【Java+selenium】
web自动化测试框架抽取示例 例子:测试登录模块,对登录的账号和密码进行不同的case校验. 1.1.1 无优化代码login_1 package com.lee.auto.testFrome; im ...
- IntelliJ IDEA2016.1 + maven 创建java web 项目[转]
最近开始使用idea 来写java项目了,这个很流行,相比Eclipse方便了很多.功能多了,相对应的使用的复杂度也较高了,因为网上很多的使用和创建项目的简单教程,都是基于老版本的,每个新版本都有不一 ...
- 【JVM】符号引用和直接引用
在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可 ...
- Django 自定义 admin
为 model 自定义显示 label是这个Field如果在form中的话会显示的.而verbose_name在form中不会显示.只是作为一种说明而已 callable() --> 是否 ...
- wampServer2.2 You don't have permission to access /phpmyadmin/ on this server.
You don't have permission to access /phpmyadmin/ on this server. 打开 然后
- java url中文参数乱码
String city=new String(city_name.getBytes("ISO-8859-1"), "UTF-8");
- Vmware ESXi安装群晖Synology DSM 5.x
简介 在Vmware ESXI中安装群晖Synology DSM 5.0 (4528) 文件准备 Vmware ESXi用户安装需要的文件 NB_x64_5032_DSM_50-4528_Xpenol ...