首页 > 编程语言 >python网络编程 socket

python网络编程 socket

时间:2023-07-04 20:12:50浏览次数:52  
标签:socket python 编程 server client data 服务端 客户端

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


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

套接字的分类:
AF_UNIX:用在局域网中
AF_INET:用在互联网中

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

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

TCP协议的套机字编程案例:

简易版
服务端
import socket

# 1
sever = socket.socket()  # 实例化socket对象

# 2
sever.bind(('127.0.0.1', 8000))  # 给对象设置ip和端口

# 3
sever.listen(2)  # 开始监听,并设置监听数量


# 4
sock, addr = sever.accept()  # 等待接收消息 没消息时会卡在这一步
# 5
data = sock.recv(1024)  # 接收到消息后走这一步,括号里面限制了接收的最大数据,字节类型
print(f'客户段发来的消息是{data}')
# 6
sock.send(b'wo shou dao l ni de xiaoxi')  # 向客户端发送消息,必须为字节类型

# 7
sock.close()  # 结束这轮对话

# 8 关闭与这个对象的对话
sever.close()

# 能和一个客户端对象一直发了, 但是不能和第二个客户端对象一直发


客户端

import socket

# 1
client = socket.socket()  # 实例化得到一个socket对象
# 2
client.connect(('127.0.0.1', 8000))  # 连接服务器

# 3
xiao_xi = input('请输入你要传给服务器的信息(仅支持字节类型): ')
client.send(xiao_xi.encode('utf8'))  # 发送消息  要发送字节类型的消息
# 4
data = client.recv(1024)  # 接收服务器发来的消息,并限制了大小
print(f'服务器发来的消息-->{data}')
# 5
client.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协议的套接字编程

 1 服务端:
 2 import socket
 3 
 4 server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》UDP
 5 server.bind(('127.0.0.1', 8080))
 6 
 7 while True:
 8     # client_addr:客户端的地址:ip+port
 9 
10     data, client_addr = server.recvfrom(1024)  # 接收客户端发来的消息,1024是字节数
11 
12     print('===>', data, client_addr)
13     server.sendto(data.upper(), client_addr)  # 给客户端发消息
14 
15 server.close()
16 
17 客户端:
18 import socket
19 
20 client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》UDP
21 
22 while True:
23     msg = input('>>: ').strip()  # msg=''
24     client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
25     data, server_addr = client.recvfrom(1024)
26     print(data)
27 
28 client.close()

 

黏包现象

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

TCP的特性:流式协议

"""
    1 当客户端发送的数据量很小并且时间间隔很小的时候,它会把数据打包成一个包一次性发送
    2 当客户端发送的数据量很大,超过服务端设置的值的时候。 可以分多次发送
"""

 

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)

 

标签:socket,python,编程,server,client,data,服务端,客户端
From: https://www.cnblogs.com/xiaoyou898/p/17526864.html

相关文章

  • 为组态王编写的 时间段 选择 控件 python
    日历控件使用说明这是一个专门为组态软件(如组态王,力控等)设计的时间选择控件,用于选择一个时间段,来进行数据报表的查询.控件实际由2部分组成,1个UI程序,和1个modbusTCP从机服务器.从机服务器用于UI程序和组态软件的通信.  日期部分,时间间隔部分,支持滚轮改变日期......
  • 一些Java编程中的基本概念
    介绍一些编程中的基本概念,比如:标识符、变量、常量、数据类型、运算符、基本数据类型的类型转换等。二进制和十进制的转化1.十进制整数转换为二进制整数采用"除2取余,逆序排列"法。2.二进制转十进制采用“权相加法”。注释在Java中根据注释的功能不同,主要分为单行注释、多行注......
  • Java编程里的控制语句
    控制语句:把语句组合成能完成一定功能的小逻辑模块。它分为三类:顺序、选择和循环。1.“顺序结构”代表“先执行a,再执行b”的逻辑。2.“条件判断结构”代表“如果…,则…”的逻辑。3.“循环结构”代表“如果…,则重复执行…”的逻辑。条件判断结构(选择结构)条件判断结构有:if结构......
  • Python | yield关键字详解
    yield关键字的说明yield是Python中的一个关键字,它通常与生成器函数一起使用。yield就是保存当前程序执行状态。你用for循环的时候,每次取一个元素的时候就会计算一次。用yield的函数叫generator,和iterator一样,它的好处是不用一次计算所有元素,而是用一次算一次,可以节省......
  • python函数外变量传到函数内处理后不改变函数外的变量,copy模块使用
    线上代码a=[1,2,3]defabc(a):a.remove(1)abc(a)print(a)这段代码先指定了一个a变量是个list,又写了一个abc函数,功能是把外面传进来的list里面的1这个值去掉按理说在函数内的执行只应该属于函数内的变化,但是实际打印结果是[2,3],函数把外面变量的1删掉了这不是我想要......
  • python接口自动化封装导出excel方法和读写excel数据
    一、首先需要思考,我们在页面导出excel,用python导出如何写入文件的封装前需要确认python导出excel接口返回的是一个什么样的数据类型如下:我们先看下不对返回结果做处理,直接接收数据类型是一个对象,无法获取返回值此时我们需要对返回数据做处理,如下;response.text#响应文本数据......
  • Python 元组转换为列表
    1.直接将元组转为列表tup=(21,19,11,46,18)print(tup)lt=list(tup)print(lt)输出(21,19,11,46,18)[21,19,11,46,18]2.将元组列表转为列表#Listoftupleinitializationlistoftuples=[("Apple",1),("Microsoft",2),("Amazon",......
  • 【雕爷学编程】Arduino动手做(149)---MAX9814咪头传感器模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • python计算某字符出现次数
    count()方法用于统计字符串里某个字符或子字符串出现的次数.st1=input().upper()st2=input().upper()print(st1.count(st2))tips:只要将所有字符串统一转化为大写或者小写,计算次数即可。upper()全部转化为大写lower()全部转化为小写另:str.count(sub,start=0,en......
  • Python中对open读取文件内容时的mode模式解析
    1.Python可以使用open函数来实现文件的打开,关闭,读写操作;Python3中的open函数定义为:open(file,mode='r',buffering=None,encoding=None,errors=None,newline=None,closefd=True)其中mode列表为:'r'#openforreading(default)'w'#openforwriting,truncatin......