python 局域网通信 socket server client
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相关推荐
- Python 下的 tcp server/client 通信
说明:只做基础,不做延伸,直接上代码 1.源文件 server.py from socket import *server = socket(AF_INET, SOCK_STREAM) server. ...
- python 局域网通信_python实现局域网内实时通信代码
使用场景,本地服务器一直在运算数据,实时发送这些数据给客户端,本地局域网内其他客户,可以实时连接服务器,获取服务器数据,互不影响. python2服务端 #-*- coding:utf-8 -*- _ ...
- python局域网通信_python如何实现网络通信
1 TCP通信: TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议.TCP通信需要经过创 ...
- 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 绑定 ...
- 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 ...
- python socket server库_python基础之socket与socketserver
---引入 Socket的英文原义是"孔"或"插座",在Unix的进程通信机制中又称为'套接字'.套接字实际上并不复杂,它是由一个ip地址以及一个端口号组成.S ...
- 不同局域网之间socket通信
文章目录 不同局域网之间socket通信 前言 一.所需的硬件及软件 二.步骤 1.配置阿里云服务器安全组 2.在阿里云服务器下载frp,配置frps端 3.在设备2下下载frp,配置frpc端 如果 ...
- python +java 用socket在局域网进行图片上传给springboot后端并进行前端访问
客户端: python 服务端: java(springboot项目) 设备是两台电脑,一台windows一台ubuntu系统 客户端: import os import sys import str ...
- python 实现TCP socket通信和 HTTP服务器、服务器和客户端通信python实例
python 实现TCP socket通信和 HTTP服务器.服务器和客户端通信实例 socket是什么? 服务器和客户端通信的流程 python 实现TCP socket通信例子 关于Host和PO ...
最新文章
- 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)
- PowerDesigner 连接MySQL数据库详细步骤
- MVC 学习日志1(上)
- VS2010 SP1
- modelandview使用过程_面试问烂的 Spring AOP 原理、Spring MVC 过程
- 卡特兰数(简单说说)
- cglib_cglib:缺少的手册
- CentOS7安装MySQL初始密码设置:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:
- 一起学设计模式 - 桥接模式
- JSP连接SQLServer数据库特别要注意一个小问题得到解决
- IntelliJ IDEA 记学习笔《Patch 创建补丁》
- linux搭建dlna媒体服务器,群晖安装DLNA简单配置打造媒体服务器
- VBA操作CAD画一条直线
- Debain查看ip地址
- C++学习笔记--多继承
- 苹果手机怎么关闭自动调节亮度_怪不得手机总是耗电快,原来是这几个设置没关闭,看完涨知识了...
- 神经网络与深度学习第三周-Planar data classification with one hidden layer
- 【C语言编程4】输入年份输出全年日历
- 刷完这50个标准库模块:没人比我更懂Python了
- 网页如何与小程序交互通信