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七层 ...
随机推荐
- deepin下安装Qt5&以及部分问题解决
deepin安装Qt5 1 deepin商店里的Qt5版本太低,可以直接下载官方的Qt5安装包: 官方下载渠道:http://www.qt.io/download-open-source/ 离线镜像下 ...
- 面试题 | 数据库笔试题集合·之·SQL语句(2)
第2章 SQL 语句 2.1 选择2.1.1 DELETE FROM S WHERE 年龄>60 语句的功能是( A ) A.从 S 表中彻底删除年龄大于 60 岁的记录B.S 表中年龄大于 6 ...
- POJ 3585 Accumulation Degree 题解
题面 一句话题意:找一个点使得,使得从这个点出发作为源点,发出的流量最大,输出这个最大的流量 这道题是换根法+二次扫描的模板: 首先若确定1为原点,那么可以写出dp方程:当v的度是1时, g[u]+= ...
- $APIO~2019$ 游记
我是鸽子. Upd:我全国倒数第一稳了. Uupd:时间过去好久了,这段时间发生很多事,比如NOIP没了... APIO时候的事也记得不是很清楚了,随便写点颓废资料吧: 如果想吃离酒店最近的一家火锅店 ...
- 将ShellCode注入进程内存
内存注入ShellCode的优势就在于被发现的概率极低,甚至可以被忽略,这是因为ShellCode被注入到进程内存中时,其并没有与之对应的硬盘文件,从而难以在磁盘中取证,但也存在一个弊端由于内存是易失 ...
- LeetCode题目(python)
1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样 ...
- springboot中model,modelandview,modelmap的区别与联系
springboot 中Model,ModelAndView,ModelMap的区别与联系 Model是一个接口,它的实现类为ExtendedModelMap,继承ModelMap类 public c ...
- easyUI解析原理
easyUI通过parser解析器,对页面中的html元素进行查找, 如果查找到class名以easyui-开头的标签,就调用easyui对应的组件,将该标签封装成easyui的组件
- BFC的概念、BFC触发方式、BFC作用介绍
一.BFC的概念 GFC——block fomatting context(中文译为块级格式化上下文) 二. 如何触发BFC 1. 设置 float 除 none 以外的值(left.right) 2 ...
- Linux系统账户管理指令
sudo passwd -l weblogic 锁定账户 sudo passwd -u weblogic 解锁账户 useradd weblogic -p xxxxx 添加账户指定密码 sudo us ...