• 【Python】网络编程


    Socket

    Socket (简称 套接字)是进程之间通信一个工具,进程之间想要进行网络通信需要socket。Socket负责进程之间的网络数据传输,好比数据的搬运工。

    在这里插入图片描述

    客户端和服务端

    2个进程之间通过Socket进行相互通讯,就必须有服务端和客户端

    Socket服务端:等待其它进程的连接、可接受发来的消息、可以回复消息

    Socket客户端:主动连接服务端、可以发送消息、可以接收回复

    在这里插入图片描述

    Socket服务端编程

    主要分为如下几个步骤:
    1、创建socket对象

    import socket
    socket_server = socket.socket()
    
    • 1
    • 2

    2、绑定socket_server到指定IP和地址

    socket_server.bind((host, port))
    
    • 1

    3、服务端开始监听端口

    socket_server.listen(backlog)
    # backlog为int整数,表示允许的连接数量,超出的会等待,可以不填,不填会自动设置一个合理值
    
    • 1
    • 2

    4、接收客户端连接,获得连接对象

    conn, address = socket_server.accept()
    print(f'接收到客户端连接,连接来自:{address}')
    # accept()是阻塞方法,如果没有连接,会卡在当前这一行不向下执行代码
    # accept()返回的是一个二元元组,可以使用上述形式,用两个变量接收二元元组的2个元素
    
    • 1
    • 2
    • 3
    • 4

    5、客户端连接后,通过recv方法,接收客户端发送的消息

    while True:
        data = conn.recv(1024).decode('UTF-8')
        # recv()的返回值是字节数组(Bytes),可以通过decode使用UTF-8解码为字符串
        # recv()的传参是buffsize(缓冲区大小),一般设置为1024即可
        print(f'接收到发送来的数据:{data}')
    
        # 6、通过conn(客户端当次连接对象),调用send()可以回复消息
        reply = input('输入要和客户端回复的消息:')
        if reply == 'exit':
            break
        conn.send(reply.encode('UTF-8'))
    # 可以通过while True无线循环来持续和客户端进行数据交互
    # 可以通过判定客户端发来的特殊标记,如exit,来退出无线循环
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    7、conn(客户端当次连接对象)和socket_server对象调用close()关闭连接

    示例:

    # socket服务端开发
    import socket
    
    # 1、创建socket对象
    socket_server = socket.socket()
    
    # 2、绑定socket_server到指定IP和地址
    socket_server.bind(('localhost', 8888))
    
    # 3、服务端开始监听端口
    socket_server.listen(1)
    
    # 4、接收客户端连接,获得连接对象
    conn, address = socket_server.accept()
    print(f'接收到客户端连接,连接来自:{address}')
    
    # 5、客户端连接后,通过recv方法,接收客户端发送的消息
    while True:
        data = conn.recv(1024).decode('UTF-8')
        # recv()的返回值是字节数组(Bytes),可以通过decode使用UTF-8解码为字符串
        # recv()的传参是buffsize(缓冲区大小),一般设置为1024即可
        print(f'接收到发送来的数据:{data}')
    
        # 6、通过conn(客户端当次连接对象),调用send()可以回复消息
        reply = input('输入要和客户端回复的消息:')
        if reply == 'exit':
            break
        conn.send(reply.encode('UTF-8'))
    
    # 7、关闭连接
    conn.close()
    socket_server.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    Socket客户端编程

    主要分为如下几个步骤:

    1、创建socket对象

    import socket
    socket_server = socket.socket()
    
    • 1
    • 2

    2、连接到服务端

    socket_client.connect((host, port))
    
    • 1

    3、发送消息

    while True:
        send_msg = input('输入要发送的消息:')
        if send_msg == 'exit':
            # 通过特殊标记来确保可以退出无线循环
            break
        socket_client.send(send_msg.encode('UTF-8'))	# 消息需要编码为字节数组(UTF-8编码)
        
        # 4、接收返回消息
        recv_data = socket_client.recv(1024).decode('UTF-8')	# 接收到的消息需要通过UTF-8解码为字符串
        # 1024是缓冲区大小,一般1024即可
        # recv()是阻塞式的,即不接收到返回,就卡在这里等待
        print(f'服务端回复消息为:{recv_data}')	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4、关闭连接

    socket_client.close()
    
    • 1

    示例:

    # socket客户端开发
    import socket
    
    # 1、创建socket对象
    socket_client = socket.socket()
    
    # 2、连接到服务端
    socket_client.connect(('localhost', 8888))
    
    # 3、发送消息
    while True:
        send_msg = input('输入要发送的消息:')
        if send_msg == 'exit':
            # 通过特殊标记来确保可以退出无线循环
            break
        socket_client.send(send_msg.encode('UTF-8'))  # 消息需要编码为字节数组(UTF-8编码)
    
        # 4、接收返回消息
        recv_data = socket_client.recv(1024).decode(
            'UTF-8')    # 接收到的消息需要通过UTF-8解码为字符串
        # 1024是缓冲区大小,一般1024即可
        # recv()是阻塞式的,即不接收到返回,就卡在这里等待
        print(f'服务端回复消息为:{recv_data}')
    
    # 4、关闭连接
    socket_client.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    运行结果

    先运行服务端,再运行客户端。此处启动两个cmd窗口进行演示。

    在这里插入图片描述

  • 相关阅读:
    北邮 数字系统设计 12 Arithmetic
    调味品行业数据分析
    <JavaEE> 理解IP协议的两个功能 -- 地址管理和路由选择
    基于PHP+MySQL大学教学工作网络平台的设计与实现
    【分治算法】Hanoi塔问题Python实现
    Guava LongMath类
    设计模式——模板方法
    用深度强化学习来玩Chrome小恐龙快跑
    电力电子转战数字IC20220729day59——uvm入门实验1
    javascript跨域传输数据的设置和兼容浏览函数代码
  • 原文地址:https://blog.csdn.net/qq_45917176/article/details/132792969