首页 > 编程语言 >python基础day37 基于TCP、UDP协议的套接字编程和粘包现象

python基础day37 基于TCP、UDP协议的套接字编程和粘包现象

时间:2023-07-04 16:22:04浏览次数:40  
标签:UDP socket python day37 server 服务端 data ### 客户端

基于TCP协议的套接字编程(socket编程)

什么是Socket?

我们经常把Socket翻译为套接字,Socket是在应用层和传输层之间的一个抽象层,它把TCO/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信

 

 

套接字的分类:

AF_UNIX:用在局域网中

AF_INET:用在互联网中

客户端和服务端如何启动?

应该先启动服务端,服务端启动之后,等待客户端来连接,然后节后客户端发来的消息,进行通信

 

建议版本的套接字编程

# 服务端
import socket


"""
# SOCK_STREAM:使用的是TCP协议
# SOCK_DGRAM:使用的是UDP协议
"""
# AF_INET:指定这个就完事了
# 买了个手机
server = socket.socket()  # 实例化得到socket对象
# server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 实例化得到socket对象
# server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 实例化得到socket对象

###2. 服务端绑定信息
# 给手机买了个手机卡
server.bind(("127.0.0.1", 8000))

###3.监听消息
server.listen(3)  # 3代表的是半连接池:可以等待的客户端的数量
###4. 接收消息

sock, addr = server.accept()  # 代码走到这里会停住,等待接收客户端发来的消息

"""
sock:代表的是当前客户端的连接对象
addr:代表的是客户端的信息(ip+port)
"""

###5.真正的取到客户端发来的消息
data = sock.recv(1024) # 接收的最大数据,字节类型

print("客户端发来的消息:%s" % data)
###6. 服务端个客户端发消息
sock.send(b'hello')  # 数据类型必须是字节类型

###7. 断开与客户端之间的连接
sock.close()

###8. 关机
server.close()



##################客户端
import socket

"""
# SOCK_STREAM:使用的是TCP协议
# SOCK_DGRAM:使用的是UDP协议
"""
# AF_INET:指定这个就完事了
# 买了个手机
client = socket.socket()  # 实例化得到socket对象
# server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 实例化得到socket对象
# server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 实例化得到socket对象


###2.连接服务端
client.connect(("127.0.0.1", 8000))

###3. 给服务端发送消息
client.send(b'helloworld')  # 也要发送字节类型

###4. 接收一些服务端发来的消息
data = client.recv(1024)  # 一次接收的最大数据量,字节类型
print("服务端发来的消息:%s" % data)
###5. 挂断
client.close()

加上通信循环

# 服务端
import socket


"""
# SOCK_STREAM:使用的是TCP协议
# SOCK_DGRAM:使用的是UDP协议
"""
# AF_INET:指定这个就完事了
# 买了个手机
server = socket.socket()  # 实例化得到socket对象
# server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 实例化得到socket对象
# server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 实例化得到socket对象

###2. 服务端绑定信息
# 给手机买了个手机卡
server.bind(("127.0.0.1", 8000))

###3.监听消息
server.listen(3)  # 3代表的是半连接池:可以等待的客户端的数量
###4. 接收消息


while True:
    sock, addr = server.accept()  # 代码走到这里会停住,等待接收客户端发来的消息

    """
    sock:代表的是当前客户端的连接对象
    addr:代表的是客户端的信息(ip+port)
    """

    ###5.真正的取到客户端发来的消息
    data = sock.recv(1024) # 接收的最大数据,字节类型

    print("客户端发来的消息:%s" % data)
    ###6. 服务端个客户端发消息
    sock.send(data.upper())  # 数据类型必须是字节类型

    ###7. 断开与客户端之间的连接
    sock.close()

###8. 关机
server.close()

加上连接循环

# 服务端
while True:
    sock, addr = server.accept()  # 代码走到这里会停住,等待接收客户端发来的消息

    """
    sock:代表的是当前客户端的连接对象
    addr:代表的是客户端的信息(ip+port)
    """
    while True:
        try:
            ###5.真正的取到客户端发来的消息
            data = sock.recv(1024) # 接收的最大数据,字节类型
            if len(data) == 0:
                continue
            print("客户端发来的消息:%s" % data)
            ###6. 服务端个客户端发消息
            sock.send(data.upper())  # 数据类型必须是字节类型
        except ConnectionResetError as e:
            print(e)
            break

    ###7. 断开与客户端之间的连接
    sock.close()

###8. 关机
server.close()



##########################客户端

###2.连接服务端
client.connect(("127.0.0.1", 8000))

while True:
###3. 给服务端发送消息
    # 接收用户输入的消息
    inp_data = input("请输入发送给服务端消息:")
    client.send(inp_data.encode("utf8"))  # 也要发送字节类型

    ###4. 接收一些服务端发来的消息
    data = client.recv(1024)  # 一次接收的最大数据量,字节类型
    print("服务端发来的消息:%s" % data)

基于UDP协议的套接字编程

# 服务端
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》UDP
server.bind(('127.0.0.1', 8080))

while True:
    # client_addr:客户端的地址:ip+port

    data, client_addr = server.recvfrom(1024)  # 接收客户端发来的消息,1024是字节数

    print('===>', data, client_addr)
    server.sendto(data.upper(), client_addr)  # 给客户端发消息

server.close()

# 客户端:
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》UDP

while True:
    msg = input('>>: ').strip()  # msg=''
    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
    data, server_addr = client.recvfrom(1024)
    print(data)

client.close()

粘包现象

client --------------------------------server
                                    9999
                                    1024
        9999-1024
黏包现象:其实就是管道里面的数据没有被完全取出来

TCP的特性:流式协议
"""
    当客户端发送的数据量很小并且时间间隔很小的时候
    它会把数据打包成一个包一次性发送
"""

struct模块

import struct


# 1000  ======> 4
# 1000000 =======> 4
# helloworld ========> 4


"""报头:4个字节"""

# res=struct.pack('i', 1000)

# i:被打包的数据大小是有限制的
# res=struct.pack('q', 100000000000000000000)
# # res=struct.pack('i', 200000000)
# print(len(res))  # 4
#
# # 解包
# res1=struct.unpack('q', res)[0]
# print(res1)

 

标签:UDP,socket,python,day37,server,服务端,data,###,客户端
From: https://www.cnblogs.com/zfq132/p/17526062.html

相关文章

  • python中如何简洁剔除列表中的特定值
    在Python中,可以使用列表推导式或filter函数来剔除列表中的特定值。方法一:使用列表推导式original_list=[1,2,3,4,5]exclude_value=3new_list=[xforxinoriginal_listifx!=exclude_value]print(new_list)#输出:[1,2,4,5]方法二:使用filter函数origi......
  • pip安装python包到指定python版本下
    1.命令行进入到指定python安装目录。比如我电脑上有python3.8也有python3.9。准备给python3.9安装指定的包2.执行:python-mpipinstall包名......
  • python学习_转义字符
    一、什么是转义字符转义字符反斜杠(\),转义字符的表现形式:反斜杠+想要实现转义功能首字母如:\n:换行,n是newline的首字母    \r:回车,r是return的首字符,回车是光标回到当前行的开头位置    \t:水平制表符,t是tab的首字母(一个\t占4个空格)    \b:退格,b是ba......
  • python如何操作读取excel表格数据之xlrd模块
    xlrd模块支持读取xlsx和xls两种格式的excel表格数据,使用之前需要先安装(可以通过pip安装) importxlrd#读取excel文件路径readfile=xlrd.work_bork(r'excel文件所在路径') #获取sheetsheet=readfile.sheet_names()obj_sheet=readfile.sheet_by_name('sheet1') #......
  • python中安装Mayavi的方法
    参考1:https://www.yisu.com/zixun/225865.html(python中安装pyqt4的方法)参考2:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyqt4(python的lib库)参考3:http://www.manongjc.com/detail/64-fcfwoqunffxbskx.html(Windows+Python3.6安装Mayavi工具包(whl方法)......
  • Ubuntu源码编译安装Python3.8
    一、下载源码https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz二、编译参数--prefix:指定安装目录使用–prefix参数可以指定Python的安装目录,例如:./configure--prefix=/usr/local/python38这将把Python3.8安装在/usr/local/python38目录下。–enable-optim......
  • ❤️最详细的Python学习路线-图文不废话
            当谈论学习Python编程时,有许多不同的途径和资源可供选择。为了帮助你建立起一个学习Python的有效路线,下面是一个包含基本步骤和关键资源的建议。请注意,这只是一个指南,你可以根据自己的兴趣和学习风格进行调整。以下时间不适用于每一个人,但是学习路径以及思路方法却......
  • 巨详细的一份Python学习路径文档--如何精准的入手Python
    当谈论学习Python编程时,有许多不同的途径和资源可供选择。为了帮助你建立起一个学习Python的有效路线,下面是一个包含基本步骤和关键资源的建议。 「请注意,这只是一个指南,你可以根据自己的兴趣和学习风格进行调整。」简章「确定学习目标:」明确自己学习Python的目的和用途。是为了数......
  • Python Django 零基础从零到一部署服务,Hello Django!全文件夹目录和核心代码!
    在这篇文章中,我将手把手地教你如何从零开始部署一个使用Django框架的Python服务。无论你是一个刚开始接触开发的新手,还是一个有经验的开发者想要快速了解Django,这篇教程都会为你提供一条清晰的路径。我们将从环境搭建开始,一步一步地创建一个可以处理GET和POST请求的服务,让你能在实......
  • Python Django 零基础从零到一部署服务,Hello Django!全文件夹目录和核心代码!
    在这篇文章中,我将手把手地教你如何从零开始部署一个使用Django框架的Python服务。无论你是一个刚开始接触开发的新手,还是一个有经验的开发者想要快速了解Django,这篇教程都会为你提供一条清晰的路径。我们将从环境搭建开始,一步一步地创建一个可以处理GET和POST请求的服务,让你能在实......