1.写在前面的话:

这两天在帮实验室老板打工,需要实现局域网通信,本来觉得挺简单的,网上那么多,Ctrl+C,Ctrl+V谁不会,自己测试的时候发送接受一两条消息没啥问题,直到联调的时候,发送接受数据速度和量上去,问题一堆,直接搞心态。所以,还是编程基础太差,另外没搞清楚原理就上,学校还好,以后出去打工不得背锅。基础不牢,地动山摇。

之后,上网查了一些相关资料,找到了一篇大佬的文章,详细介绍了TCP协议,粘包和半包问题,产生的原因,以及java编程的三种解决方案,本文参考这篇文章,采用了其中的第二种,python 编程以做演示。

Socket粘包问题的3种解决方案,最后一种最完美! - Java中文社群 - 博客园

2.问题描述:

在server和client端,socket编程发送和接受数据时候使用TCP 协议,出现了粘包和半包的情况。

3.原因分析:

4.解决方案:

在另外一篇文章中看到:使用特殊字符结尾的解决方案并不被看好,其中优劣,各位看官自行斟酌,个人选择了数据包封装的方法。

【Python】TCP Socket的粘包和分包的处理_代码就是生产力!-CSDN博客_python socket 粘包

5.python编程实现:(解决方案二)

server:

#!/usr/bin/env python
# -*- coding: utf-8 -*-import socket
import struct
# 创建一个socket套接字,该套接字还没有建立连接
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定监听端口,这里必须填本机的ip,后面6688是端口号,自选
server.bind(('192.168.0.105', 6688))
# 开始监听,并设置最大连接数
server.listen(5)print(u'waiting for connect...')
# 等待连接,一旦有客户端连接后,返回一个建立了连接后的套接字和连接的客户端的IP和端口元组
connect, (host, port) = server.accept()
print(u'the client %s:%s has connected.' % (host, port))while True:# 接受客户端的数据# 先接收保存有数据长度的4个byterec_data_len = connect.recv(4)# 得到数据长度rec_data_len1=struct.unpack('i',rec_data_len)[0]# 接收得到数据长度的数据data=connect.recv(rec_data_len1)# 如果接受到客户端要quit就结束循环if data == b'quit' or data == b'':print(b'the client has quit.')breakelse:# 发送数据给客户端connect.send(b'your words has received.')print(b'the client say:' + data)# 结束socket
server.close()

client:

#!/usr/bin/env python
# -*- coding: utf-8 -*-import socket
import struct# 创建一个socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 主动去连接局域网内IP为192.168.27.238,端口为6666的进程,即服务器端设置的ip和端口
client.connect(('192.168.0.105', 6688))while True:# 接受控制台的输入data =input()# 对数据进行编码格式转换,不然报错data = data.encode('utf-8')# 如果输入quit则退出连接if data == b'quit':print(b'connect quit.')breakelse:#确定要发送数据的长度data_len=len(data)#将这个长度打包成特定byte的数据,参数'i'表明4个bytesend_data_len=struct.pack('i',data_len)# 发送数据长度client.send(send_data_len)#发送数据client.send(data)# 接收服务端的反馈数据# 先接收保存有数据长度的4个byterec_data_len = client.recv(4)# 得到数据长度rec_data_len1=struct.unpack('i',rec_data_len)[0]# 接收得到数据长度的数据rec_data=client.recv(rec_data_len1)print(b'form server receive:' + rec_data)# 发送数据告诉服务器退出连接
client.sendall(b'quit')
client.close()

6.发展中进步:

在总结这些的过程中发现,可以使用json文件进行文件收发,这样可以带来更多便利,之后可以学习一下,另外,多client连接server也有必要学习一下,期待我之后的总结吧!!

python 局域网通信 socket server client相关推荐

  1. Python 下的 tcp server/client 通信

    说明:只做基础,不做延伸,直接上代码 1.源文件 server.py from socket import *server = socket(AF_INET, SOCK_STREAM) server. ...

  2. python 局域网通信_python实现局域网内实时通信代码

    使用场景,本地服务器一直在运算数据,实时发送这些数据给客户端,本地局域网内其他客户,可以实时连接服务器,获取服务器数据,互不影响. python2服务端 #-*- coding:utf-8 -*- _ ...

  3. python局域网通信_python如何实现网络通信

    1 TCP通信: TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议.TCP通信需要经过创 ...

  4. 2-3 建立简易TCP服务端、客户端【socket server/client】【socket、bind、listen、accept、send、closesocket】【conect、recv】

    2-3 建立简易TCP服务端.客户端 文章目录 2-3 建立简易TCP服务端.客户端 0-前言 1-服务端简易功能 2-客户端简易功能 3-代码逻辑 4-服务端 4-1 建立socket 4-2 绑定 ...

  5. Apollo 笔记(03)— Cyber RT Python 接口(channel 读和写、server/client 通信、record 文件读写信息查询、timer 时间定时器操作)

    https://cyber-rt.readthedocs.io/en/latest/CyberRT_Python_API.html https://cyber-rt.readthedocs.io/en ...

  6. python socket server库_python基础之socket与socketserver

    ---引入 Socket的英文原义是"孔"或"插座",在Unix的进程通信机制中又称为'套接字'.套接字实际上并不复杂,它是由一个ip地址以及一个端口号组成.S ...

  7. 不同局域网之间socket通信

    文章目录 不同局域网之间socket通信 前言 一.所需的硬件及软件 二.步骤 1.配置阿里云服务器安全组 2.在阿里云服务器下载frp,配置frps端 3.在设备2下下载frp,配置frpc端 如果 ...

  8. python +java 用socket在局域网进行图片上传给springboot后端并进行前端访问

    客户端: python 服务端: java(springboot项目) 设备是两台电脑,一台windows一台ubuntu系统 客户端: import os import sys import str ...

  9. python 实现TCP socket通信和 HTTP服务器、服务器和客户端通信python实例

    python 实现TCP socket通信和 HTTP服务器.服务器和客户端通信实例 socket是什么? 服务器和客户端通信的流程 python 实现TCP socket通信例子 关于Host和PO ...

最新文章

  1. 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)
  2. PowerDesigner 连接MySQL数据库详细步骤
  3. MVC 学习日志1(上)
  4. VS2010 SP1
  5. modelandview使用过程_面试问烂的 Spring AOP 原理、Spring MVC 过程
  6. 卡特兰数(简单说说)
  7. cglib_cglib:缺少的手册
  8. CentOS7安装MySQL初始密码设置:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:
  9. 一起学设计模式 - 桥接模式
  10. JSP连接SQLServer数据库特别要注意一个小问题得到解决
  11. IntelliJ IDEA 记学习笔《Patch 创建补丁》
  12. linux搭建dlna媒体服务器,群晖安装DLNA简单配置打造媒体服务器
  13. VBA操作CAD画一条直线
  14. Debain查看ip地址
  15. C++学习笔记--多继承
  16. 苹果手机怎么关闭自动调节亮度_怪不得手机总是耗电快,原来是这几个设置没关闭,看完涨知识了...
  17. 神经网络与深度学习第三周-Planar data classification with one hidden layer
  18. 【C语言编程4】输入年份输出全年日历
  19. 刷完这50个标准库模块:没人比我更懂Python了
  20. 网页如何与小程序交互通信

热门文章

  1. 基础算法题——城市间最短路程(Floyd算法)
  2. c++面试高频题-速记版
  3. 【GitHub】在Github主页显示你的个人简历
  4. 文献阅读记录(忆阻器篇)
  5. l7sa008b故障代码_韩国麦克比恩电机-L7S 中文说明书 ver1.9.pdf
  6. 在技术上如何发送一条短信?
  7. 互联神州CCSP冬季集训班信息
  8. 计算机的正确配置文件,详解使用最近一次的正确配置的具体步骤
  9. 【C应用】红外遥控小车程序分析(下)——红外传输数据程序分析
  10. 一个64位操作系统的实现