socket编程相关阐述
一、socket初识
①服务端
import socket server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5) # 半连接池 conn, addr = server.accept() # 待机等待接听电话 data = conn.recv(1024) # 接听别人说话,只接收1024字节
print(data)
conn.send(b'hello girl') # 跟别人说话 conn.close() # 关闭通信连接
server.close() # 关闭服务端
②客户端
import socket client = socket.socket()
client.connect(('127.0.0.1', 8080)) client.send(b'hello how much?')
data = client.recv(1024)
print(data) client.close()
二、通信循环
①服务端
服务端:
有固定的ip和port
24小时不间断提供服务 import socket server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5) conn, addr = server.accept() while True:
try:
data = conn.recv(1024)
if len(data) == 0:break
print(data)
conn.send(data.upper())
except ConnectionResetError:
break conn.close()
server.close()
②客户端
import socket client = socket.socket()
client.connect(('127.0.0.1', 8080)) while True:
msg = input('>>>:').encode('utf-8')
if len(msg) == 0: continue
client.send(msg)
data = client.recv(1024)
print(data)
三、链接循环
①服务端
import socket server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5) while True:
conn, addr = server.accept() while True:
try:
data = conn.recv(1024)
if len(data) == 0:break
print(data)
conn.send(data.upper())
except ConnectionResetError:
break conn.close()
server.close()
②客户端
import socket client = socket.socket()
client.connect(('127.0.0.1', 8080)) while True:
msg = input('>>>:').encode('utf-8')
if len(msg) == 0: continue
client.send(msg)
data = client.recv(1024)
print(data)
四、粘包问题的产生
1、粘包问题
接收方:我不知道我要接收的数据的总长度
发送方:由于tcp协议的内部优化算法 会将数据量比较小的并且时间间隔比较短的数据一次性打包发送
2、如何解决
①发送数据直接先告诉对方数据量的大小
②利用struct模块定制我们自己的消息传输协议
3、最终版本解决粘包问题
客户端:
①制作字典报头
②发送报头
③再发送字典
④再发你的真实数据
服务端:
①先收4个长度的报头
②解析报头,获取字典长度
③接收字典(反序列化) ——>> 获取字典里面所有信息
④接收真实数据
五、TCP协议特点:会将数据量比较小的并且时间间隔比较短的数据一次性打包发送
①服务端
import socket server = socket.socket()
server.bind(('127.0.0.1',8088))
server.listen(5) # 半连接池 conn,addr = server.accept()
data = conn.recv(5) # 指定收到数据量的大小为5个,如果不指定,还是1024,就会出现粘包现象
print(data) # b'hello' data = conn.recv(5)
print(data) # b'hello' data = conn.recv(4)
print(data) # b'hell'
②客户端
import socket client = socket.socket()
client.connect(('127.0.0.1',8088)) client.send(b'hello')
client.send(b'hello')
client.send(b'hello')
六、struct模块
import struct data = 'dfsafsagdsfgfafsdafsdafafryuio' # 服务端
res = struct.pack('i', len(data)) # 打包:把一个数据打包为长度固定为4
print(len(res)) #
print(res) # b'\x1e\x00\x00\x00' # 客户端
ret = struct.unpack('i', res)[0] # 解包:数据真实长度
print(ret) #
socket编程相关阐述的更多相关文章
- socket编程相关的结构体和字节序转换、IP、PORT转换函数
注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...
- PHP Socket 编程进阶指南
学习准备 Linux 或者 Mac 环境: 安装有 Sockets 扩展: 了解 TCP/IP 协议. socket函数只是PHP扩展的一部分,编译PHP时必须在配置中添加 --enable-sock ...
- Java Socket编程如何建立两者关系
转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...
- Python C/S架构,网络通信相关名词,socket编程
主要内容: 一. C/S架构 二. 网络通信的相关名词 三. socket编程 一. C/S架构和B\S架构概述 1. C/S架构: Client/Server(客户端/服务端)架构 描述: C/S ...
- Socket编程(摘抄)
http://www.blogjava.net 例子代码就在我的博客中,包括六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具工程,和此小工具的所有运行时库.资源和执行程序.代码 ...
- Socket编程指南及示例程序
例子代码就在我的博客中,包括六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具工程,和此小工具的所有运行时库.资源和执行程序.代码的压缩包位置是http://www.blogja ...
- Socket编程指南及示例程序(转)
1 前言 在一些常用的编程技术中,Socket网络编程可以说是最简单的一种.而且Socket编程需要的基础知识很少,适合初学者学习网络编程.目前支持网络传输的技术.语言和工具繁多,但是 ...
- win32 socket 编程(三)——TCP/IP
一.TCP/IP解析 TCP/IP协议的核心部分是传输层协议(TCP.UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现.因此用户一般不涉及.编程时,编程界面有两种形式: 1. ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
随机推荐
- TP5报错Fatal error: require(): Failed opening required '/home/www/xx/public/../thinkphp/start.php
https://jingyan.baidu.com/article/afd8f4deb784fe34e386e97b.html https://www.cnblogs.com/300js/p/9224 ...
- Dubbo-zooKeeper入门讲解
1.Dubbo-zooKeeper史上最简单入门实例 2.Dubbo官方文档
- 【Linux 网络编程】网络IP地址结构体
(1)IPv4套接口地址结构通常也称为"网际套接字地址结构",它以"sockaddr_in"命名, 定义在<netinet/in.h> ...
- issubclass 和 isinstance和断点调试
issubclass 和 isinstance和断点调试 一.issubclass 判断第一个类是不是第二个类的子类,返回True或Flase class Foo: pass class Bar(Fo ...
- php Excel 导入
php Excel 导入 public function storeSql() { $file = input('file.excel'); $path = ROOT_PATH . 'public' ...
- EditPlus 好看的monaco主题
版本: editplus 4.3效果图:-------- 在editplus配置目录下,找到editplus_u.ini,替换为以下代码:------------------------------- ...
- js 学习四 对象应用 吃货游戏
游戏来源于 Mdn学习网站: 该例子用于对象的理解非常有效(建议看完上面网站的内容在开始练习) 弹球 body { margin: 0; overflow: hidden; font-family: ...
- C#使用反射机制获取类信息
1.用反射动态创建类实例,并调用其公有成员函数. //新建一个类库项目,增加一个GetSum方法. using System; namespace ClassLibrary1 { publi ...
- 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)
链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...
- BZOJ3745 / SP22343 NORMA2 - Norma 分治,CDQ分治
要命的题目. 写法:分类讨论进行计算. 枚举过每一个\(mid\)的所有区间.对于左端点\(i∈[l, mid - 1]\),向左推并计算\([l,mid]\)范围内的最大\(/\)最小值. 然后右端 ...