Python | Socket02 - 使用with语句建立一个TCP服务器(阻塞+单线程),将TCP客户端发过来的字符串原路返回

一、前言


Python | Socket01 - 创建一个TCP服务器(阻塞+单线程),将TCP客户端发过来的字符串原路返回

在上一篇博文完成TCP服务器简单的收发程序后,发现在Python上有更加简洁的方式来实现,使用with语法提供的上下文管理器。该程序的功能还是跟上一篇博文一样。
在这里插入图片描述

二、代码


import socket

def main():
    # 使用with语句创建并管理一个套接字对象tcp_Server
    with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as tcp_Server:
        # 套接字对象tcp_Server绑定IP地址(""表示本机IP地址)与端口号7890
        tcp_Server.bind(("",7890))  
        # 套接字对象tcp_Server进入监听状态,等待TCP客户端建立链接,最大连接数为1
        tcp_Server.listen(1)
        
        while True:
            print("等待一个新的客户端的到来:")
            # 程序进入阻塞态,当套接字对象tcp_Server接收到一个链接请求,建立新的套接字对象new_Socket去服务该TCP客户端
            new_Socket,addr = tcp_Server.accept()
            print("一个新的客户端已经到来:%s" % str(addr))
            # 使用with语句管理套接字对象new_Socket
            with new_Socket:
                # 打印连接过来的TCP客户端的IP地址与端口号
                print(addr,"connected.")
                while True:
                    # 进入阻塞态,等待TCP客户端发送字符串(最大1024个字节)过来
                    data = new_Socket.recv(1024)
                    print("客户端送过来的请求是: %s" % data.decode("utf-8"))

                    # 解除阻塞有两种情况:
                    if not data:
                        print(addr,"disconnected.") #TCP客户端断开连接,打印消息。
                        print("已经为客户端服务完毕")
                        break
                    # 数据发回去之前增加一个换行
                    data += "\n".encode("utf-8")
                    # 将收到的字符串原路返回给TCP客户端
                    new_Socket.sendall(data)
            # 使用with语句创建new_Socket套接字对象后,with退出时自动调用new_Socket.close()
    # 使用with语句创建tcp_Server套接字对象后,with退出时自动调用tcp_Server.close()

if __name__ == "__main__":
    main()

三、测试代码


先运行TCP服务器程序。
在这里插入图片描述
接着,使用网络调试助手充当TCP客户端与TCP服务器进行连接。
在这里插入图片描述

四、知识点补充


4.1、With语法的好处

使用with语法可以省去调用socket对象的close( )方法,with语法的最重要作用就是自动释放资源。不需要程序员调用close()方法释放资源了。
以下摘自《极客时间》的课程《Python 核心技术与实战》。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wallace89/article/details/122002897