• AF_UNIX(本机通信)
  • AF_INET(TCP/IP – IPv4)
  • AF_INET6(TCP/IP – IPv6)
  • SOCK_STREAM(TCP流)
  • SOCK_DGRAM(UDP数据报)

远程操作服务端的命令行。

解决沾包问题的方法:   以远程连接服务端的命令行为例子。

server服务端

  1. # _*_ coding: gbk _*_
  2. # @Author: Wonder
  3. import socket
  4. import json
  5. import subprocess
  6. import struct # 将数字类型变成固定长度,
  7. from socket import SOL_SOCKET, SO_REUSEADDR
  8.  
  9. sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10. sk.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # 重用地址
  11.  
  12. sk.bind(('127.0.0.1', 9900)) # 绑定地址和端口号 ,这里ip和端口组成一个元组
  13. sk.listen(5) # 启动监听,允许最大连接数量为3
  14. while True:
  15. sock, addr = sk.accept() # 三次握手建立的管道,支持多个客户端client进行连接
  16. while True:
  17. try:
  18. bin_cmd = sock.recv(1024) # 二进制, 接收二进制的cmd
  19. cmd = bin_cmd.decode('utf-8') # 转成真是的cmd
  20. sub_obj = subprocess.Popen(cmd, shell=True,
  21. stdout=subprocess.PIPE,
  22. stderr=subprocess.PIPE) # 操作本机cmd
  23. stdout = sub_obj.stdout.read() # 系统生成的二进制,windows环境下是gbk编码格式,Linux下是utf-8格式。
  24. stderr = sub_obj.stderr.read()
  25. '''
  26. 高级版本在于改造报头
  27. '''
  28. head_content = {
  29. 'filename': 'kazami.txt',
  30. 'secreatkey': 123456,
  31. 'header': len(stdout) + len(stderr)
  32. }
  33. head_text = json.dumps(head_content).encode('utf-8') # 序列化之后进行编码
  34.  
  35. sock.send(struct.pack('i', len(head_text))) # 发报头长度
  36. sock.send(head_text) # 发报头
  37.  
  38. sock.send(stdout)
  39. sock.send(stderr)
  40. # sock.send(str2.encode('utf-8'))
  41. except ConnectionResetError: # 当判断client断开连接后,跳出循环
  42. break
  43.  
  44. sock.close()
  45.  
  46. sk.close()

  

client  客户端

  1. # _*_ coding: gbk _*_
  2. # @Author: Wonder
  3. import socket
  4. import struct
  5. import json
  6.  
  7. sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 和 Internet中的通信,流格式。
  8. sk.connect(('127.0.0.1', 9900)) # 连接到服务端的绑定地址
  9. while True:
  10. cmd = input('>>>').strip()
  11. if not cmd:
  12. continue
  13. sk.send(cmd.encode('utf-8')) # 必须要发送二进制的数据。
  14. res1 = sk.recv(4) #取报头长度
  15. text_text_len = struct.unpack('i', res1)[0] # 获取报头的真实长度
  16. bin_head_text = sk.recv(text_text_len) # 读取报头内容
  17. head_text =json.loads(bin_head_text.decode('utf-8'))
  18.  
  19. print(head_text)
  20.  
  21. data_size = head_text.get('header') # 真实内容长度
  22.  
  23. res_byt = b''
  24. real_size = 0
  25. while real_size < data_size: #当真实拼接的长度小于数据长度时,不断拼接,直到完整数据拼出来。
  26. res = sk.recv(4444) # 最大为缓存,过大没有意义。
  27. res_byt += res
  28. real_size += len(res)
  29. print(res_byt.decode('gbk'))
  30. print(real_size)
  31. sk.close()

  

CSIC_716_20191203【 socket网络编程,以及沾包问题的高级解决方式】的更多相关文章

  1. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  2. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  3. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  4. python之Socket网络编程

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...

  5. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

  6. Socket网络编程-基础篇

    Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...

  7. Socket网络编程--FTP客户端

    Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...

  8. windows下的socket网络编程

    windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...

  9. windows下的socket网络编程(入门级)

    windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...

随机推荐

  1. BZOJ-3495 前缀优化建图2-SAT

    题意:有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. 解法:以前没学过,参考https://blog.csdn.net/linkf ...

  2. CreateFile的内部实现

    今天想看看CreateFile的内部实现,不过网上没有想要的资料,都只是对参数分析了一下.找了找WRK源码,找到CreateFile的源码自己来分析一下. HANDLE WINAPI CreateFi ...

  3. (PASS)break 和 continue 的区别

    1  break;  while循环中,break是用于永久终止循环.即不执行本次循环中break后面的语句,直接跳出循环. 终止,跳出,结束循环(可以作用在任何地方).也常与switch分支结构合用 ...

  4. poj 3744 矩阵快速幂+概率dp

    题目大意: 输入n,代表一位童子兵要穿过一条路,路上有些地方放着n个地雷(1<=n<=10).再输入p,代表这位童子兵非常好玩,走路一蹦一跳的.每次他在 i 位置有 p 的概率走一步到 i ...

  5. gif,jpg(jpeg),png,webp,base64图片格式比较

    对于web前端开发的同学来说,图片保存格式非常的重要.那么该如何选择图片保存的格式呢?下面我总结一下gif,jpg,png等图片格式的区别. gif是很早应用的一种图片格式.它采用的是lzw的压缩算法 ...

  6. vue组件实例的生命周期

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 泛型(Java 5 开始)

    前言 Java 5 开始之前,从集合读取的数据都必须进行类型转换,如果插入错误的数据就会报错. 有了泛型,编译器会自动为你的插入进行转换,并在插入时告知是否插入了类型错误的对象. 将类型由原来的具体的 ...

  8. (转)OpenFire源码学习之二:Mina基础知识

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413009 Mina概述 Apache MINA(Multipurpose Infra ...

  9. C++语言编程基础

    C++程序设计语言可以看作C语言的改进和升级,不仅完全兼容了C语言的语法和函数库,还引入了面向对象.运算符重载.多态性.数据流和模板等最新的编程思想.极大地保证了源代码的生产率.质量和可重用性.GNU ...

  10. STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时

    前面我们讲过,因为在STM32上没有系统时间的接口,因此无法调用sleep函数,在本文中,笔者将利用滴答计时器实现精准延时. 查阅技术手册,滴答计时器依赖于一个SysTick_Type类型寄存器,定义 ...