一.tcp基本语法

1.server.py

# ### 服务端
import socket
# 1.创建一个socket对象
sk = socket.socket()
# 2.绑定对应的ip和端口号(让其他主机在网络中可以找得到)
"""127.0.0.1 代表本地ip"""
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sk.bind(("127.0.0.1", 9000))
# 3.开启监听
sk.listen()
# 4.建立三次握手
conn, addr = sk.accept()
# 5.处理收发数据的逻辑
"""recv 接收 send 发送"""
res = conn.recv(1024)  # 最多一次接收 1024 字节
print(res.decode("utf-8"))
# 6.四次握手
conn.close()
# 7.退还端口
sk.close()

1.client.py

# ### 客户端
import socket
# 1.创建一个socket对象
sk = socket.socket()
# 2.与服务器建立连接
sk.connect(("127.0.0.1", 9000))
# 3.发送数据(只能发送二进制的字节流)
sk.send("北京昨天迎来了暴雨,如今有车是不行的,还得有船".encode("utf-8"))
# 4.退还端口
sk.close()

二.tcp循环发消息

1.server.py

# ### 服务端
import socket
# 1.创建socket对象
sk = socket.socket()
# 在bind方法之前加上这句话,可以让一个端口重复使用
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2.绑定ip的端口号(在网络中注册该主机)
sk.bind(("127.0.0.1", 9000))
# 3.开始监听
sk.listen()
"""
print(conn)
print(addr)
conn:<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9002), raddr=('127.0.0.1', 53620)>
addr:('127.0.0.1', 53620)
"""# 5.处理收发数据的逻辑
"""send(字节流)"""
"""
conn.send("我去北京先买船".encode("utf-8))
"""
while True:# 4.三次握手conn, addr = sk.accept()while True:res = conn.recv(1024)print(res.decode())strvar = input("请输入服务端要给客户端发送的内容")conn.send(strvar.encode())if strvar.upper() == "Q":break
# 6.四次握手
conn.close()
# 7.退还端口
sk.close()

1.client.py

# ### 客户端
import socket
# 1.创建socket对象
sk = socket.socket()
# 2.连接服务器
sk.connect(("127.0.0.1", 9000))
# 3.收发数据
"""
res = sk.recv(1024)  # 一次最多接收1024个字节
print(res.decode())
"""
while True:strvar = input("请输入您要发送的内容:")sk.send(strvar.encode())res = sk.recv(1024)if res == b"q" or res == b"Q":breakprint(res.decode())# 4.关闭连接
sk.close()

三.udp基本语法

1.server.py

# ### 服务端
import socket
# 1.创建udp对象
sk = socket.socket(type=socket.SOCK_DGRAM)
# 2.绑定地址端口号
sk.bind(("127.0.0.1", 9000))
# 3.udp服务器,在一开始只能接收数据
msg, cli_addr = sk.recvfrom(1024)print(msg.decode())
print(cli_addr)# 服务端给客户端发送数据
msg = "我是你老娘,赶紧给我回家吃饭"
sk.sendto(msg.encode(), cli_addr)# 4.关闭连接
sk.close()

1.client.py

# ### 客户端
import socket
# 1.创建udp对象
sk = socket.socket(type=socket.SOCK_DGRAM)# 2.收发数据的逻辑
# 发送数据
msg = "你好,你是mm还是gg"
# sendto(消息,(ip,端口号))
sk.sendto(msg.encode(), ("127.0.0.1", 9000))# 接收数据
msg, server_addr = sk.recvfrom(1024)
print(msg.decode())
print(server_addr)# 3.关闭连接
sk.close()

四.udp循环发消息

1.server.py

# ### 服务端
import socket
# 1.创建udp对象
sk = socket.socket(type=socket.SOCK_DGRAM)
# 2.绑定地址端口号
sk.bind(("127.0.0.1", 9000))
# 3.udp服务端,在一开始只能接收数据
while True:# 接收数据msg, cli_addr = sk.recvfrom(1024)print(msg.decode())message = input("服务端给客户端发送的消息是:")# 发送数据sk.sendto(message.encode(), cli_addr)# 4.关闭连接
sk.close()

1.client.py

# ### 客户端
import socket
# 1.创建udp对象
sk = socket.socket(type=socket.SOCK_DGRAM)
# 2.收发数据的逻辑
while True:# 发送数据message = input("客户端给服务端发送的消息是:")sk.sendto(message.encode(), ("127.0.0.1", 9000))# 接收数据msg, addr = sk.recvfrom(1024)if msg == b"q" or msg == b"Q":breakprint(msg.decode("utf-8"))# 3.关闭连接
sk.close()

五.黏包

1.server,py

# ### 服务端
import time
import socket
sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sk.bind(("127.0.0.1", 9000))
sk.listen()conn, addr = sk.accept()# 处理收发数据的逻辑
# 先发送接下来要发送数据的大小
conn.send("5".encode())
# 发完长度之后,再发数据
conn.send("hello".encode())
conn.send(",world".encode())conn.close()
sk.close()

1.client.py

# ### 客户端
"""
黏包出现的两种情况:(1)发送端发送数据太快(2)接收端接收数据太慢
"""
import socket
import time
sk = socket.socket()
sk.connect(("127.0.0.1", 9000))time.sleep(2)
# 处理收发数据的逻辑
# 先接收接下来要发送数据的大小
res = sk.recv(1)
num = int(res.decode())
# 接收num这么多个字节流
res1 = sk.recv(num)
res2 = sk.recv(1024)
print(res1)  # b'hello'
print(res2)  # b',world'sk.close()

2.server.py

# ### 服务端
import time
import socket
sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sk.bind(("127.0.0.1", 9000))
sk.listen()conn, addr = sk.accept()# 处理收发数据的逻辑
# 先发送接下来要发送的数据的大小
conn.send("00000100".encode())
# 发完长度之后,再发数据
msg = "hello" * 20
conn.send(msg.encode())
conn.send(",world".encode())conn.close()
sk.close()

2.client.py

# ### 客户端
"""
黏包出现的两种情况:(1)发送端发送数据太快(2)接收端接收数据太慢
"""
import socket
import time
sk = socket.socket()
sk.connect(("127.0.0.1", 9000))time.sleep(2)
# 发送收发数据的逻辑
# 先接收接下来要发送数据的大小
res = sk.recv(8)
num = int(res.decode())
# 接收num这么多个字节数
res1 = sk.recv(num)
res2 = sk.recv(1024)
print(res1)  # b'hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello'
print(res2)  # b',world'sk.close()
struck模块

pack:
把任意长度数字转化成具有固定4个字节长度的字节流
unpack:
把4个字节值恢复成原来的数字,返回最终的是元组

pack

import struct
# i => int 要转化的当前的数据是整型
res = struct.pack("i", 9999999)
res = struct.pack("i", 1)
res = struct.pack("i", 43999)
# pack 的范围 -2147483648 ~ 2147483647  21亿次左右
res = struct.pack("i", 2100000000)
print(res, len(res))

unpack

# i => 把对应的数据转化成int整型
tup = struct.unpack("i", res)
print(tup)  # (2100000000,)
print(tup[0])
"""
解决黏包场景:应用场景在实时通讯时,需要阅读此次发的消息是什么
不需要解决黏包场景下载或者上传文件的时候,最后要把包都结合在一起,黏包无所谓
"""

3.server.py

# ### 服务器
import time
import socket
import struct
sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sk.bind(("127.0.0.1", 9000))
sk.listen()conn, addr = sk.accept()# 处理收发数据的逻辑
strvar = input("请输入你要发送的数据")
msg = strvar.encode()
length = len(msg)
res = struct.pack("i", length)# 第一次发送的是字节流
conn.send(res)# 第二次发送的是真实的数据
conn.send(msg)# 第三次发送的是真实的数据
conn.send("世界真美好123".encode())conn.close()
sk.close()

3.client.py

# ### 客户端
"""
黏包出现的两种情况:(1)发送端发送数据太快(2)接收端接收数据太慢
"""
import socket
import time
import struct
sk = socket.socket()
sk.connect(("127.0.0.1", 9000))time.sleep(2)
# 处理收发数据的逻辑# 第一次接收的是子集长度
n = sk.recv(4)
tup = struct.unpack("i", n)
n = tup[0]# 第二次接收真实的数据
res = sk.recv(n)
print(res.decode())# 第三次接收真实的数据
res = sk.recv(1024)
print(res.decode())
sk.close()

0813Python总结-tcp,udp及黏包,struck模块相关推荐

  1. Python3之socket编程(TCP/UDP,粘包问题,数据传输、文件上传)

    一.socket的定义 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后 ...

  2. 网络通信中TCP出现的黏包以及解决方法 socket 模拟黏包

    粘包问题概述 1.1  描述背景 采用TCP协议进行网络数据传送的软件设计中,普遍存在粘包问题.这主要是由于现代操作系统的网络传输机制所产生的.我们知道,网络通信采用的套接字(socket)技术,其实 ...

  3. TCP,UDP发送数据包大小浅析

    MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小 ...

  4. tcp通信数据黏包和数据丢失问题

    前言: 我在做tcp通信项目,负责客户端,想要实现文件传输等功能,遇到了以下问题:1,数据黏包问题:2,数据丢失问题: 一,tcp数据黏包问题: 数据黏包是指tcp会对要传输的数据进行切割,然后再进行 ...

  5. python学习day32 黏包 struct模块

    为什么会出现黏包问题?  首先只有在TCP协议中才会出现黏包现象 是因为TCP协议是面向流的协议 在发送的数据 传输过程中 有缓存机制 来避免数据丢失 因此 在连续发送小数据的时候 以及接收大小不符的 ...

  6. IP/TCP/UDP/RTP/RTCP 包结构图

    IP 包头结构: TCP 包头结构: UDP 包头结构: RTP 包头结构: RTCP 包头结构:

  7. TCP/UDP协议抓包-工具wireshark与tcp侦听工具

    目录 一.工具下载链接 二.实验 一.工具下载链接 链接:https://pan.baidu.com/s/1nvNdCyET-8JFn_wQXuH2sw?pwd=abcd  提取码:abcd  --来 ...

  8. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  9. Python攻城师的成长————网络编程(socket套接字、通信循环、链接循环、黏包问题)

    今日学习目标 学习什么是socket套接字,并依靠它去处理TCP协议等网络编程问题 文章目录 今日学习目标 学习内容 一. socket套接字 1.什么是socket 2.套接字发展史及分类 3.套接 ...

  10. python中黏包问题的解决

    python中黏包问题的解决 1.在前面我们知道tcp容易产生黏包的问题,而udp不会产生黏包的问题,但是会产生丢包的问题,tcp应用的场景很多所以黏包问题必须要解决. 1.解决黏包问题第一种方法,我 ...

最新文章

  1. C++中类型转换函数:将当前类的类型转换为其它类型
  2. python基本输入输出代码示例
  3. grunt 插件_从Grunt测试Grunt插件
  4. Sort HDU5884(二分+多叉哈夫曼树)
  5. java从基础到入门_Java从入门到入土(30)继承基础
  6. C案例:打印斐波拉契数列
  7. Java 读取txt文件,读取结果保存到数据库
  8. 编程语言“鄙视链” +1?亚马逊力捧 Rust,Go 技术负责人连发 14 条推特抵制“拉踩”...
  9. ASP.NET页面传值方式
  10. win 10专业版中虚拟机里面无法按打开centos镜像
  11. Dynamic Web 2021Crack版,文档扫描和图像捕获
  12. masm 16位汇编语法
  13. 小米重新上锁[BL]
  14. 小米5S刷机认真看一眼就能会的简单详细教图文
  15. 福昕阅读器不显示菜单栏和工具栏
  16. 华为S系列交换机修改密码不成功
  17. 【阅读笔记】这本书可以让你戒烟
  18. 选择题汇总6-7(括号里填的答案都是对的,不用管下面那个答案正确与错误,因为作者懒得删了)
  19. 17. A Unified Generative Framework for Aspect-Based Sentiment Analysis
  20. 可爱卡通系51劳动节主题PPT模板

热门文章

  1. VMware Workstation虚拟机无法获取IP地址的解决办法
  2. 7z的压缩包linux下如何解压软件,7z(p7zip)压缩软件在Linux下的安装和使用
  3. android 如何绕过签名校验
  4. Untiy Shader - Metallic vs Specular Workflow 金属 vs 高光的工作流
  5. 护照、身份证识别阅读器
  6. linux中国共享文件,linux上的文件共享服务详解
  7. FormulaR1C1是EXCEL中单元格公式输入方法
  8. 箭头代码示例---某著名支付平台sdk源码
  9. WiFi遥控小车(四):简单直流电机驱动及UDP通信程序
  10. ULC2平台CTA音频调试记