• 【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窗口进行演示。

    在这里插入图片描述

  • 相关阅读:
    fpga入门 串口定时1秒发送1字节
    leetcode: 122. 买卖股票的最佳时机II
    第六章:函数(中)
    Android 10.0 Launcher3 app图标长按去掉应用信息按钮
    Java 图片验证码需求分析
    @Autowired与@Resource区别
    十四天学会C++之第一天(入门和基本语法)
    C++ 中生成随机数的代码
    cas:216300-12-8|1-丙基-3-甲基咪唑六氟磷酸盐[C3MIm]PF6离子液体分子量:125
    手把手开发Admin 系列五(规划api篇)
  • 原文地址:https://blog.csdn.net/qq_45917176/article/details/132792969