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

一、前言


使用Python可以很简单地创建一个TCP服务器程序,该TCP服务器的程序目的是完成这个功能:TCP客户端发送一段字符串给TCP服务端,TCP服务端将字符串原路返回去。
在这里插入图片描述
我是从该B站视频教程学习python的socket编程:
https://www.bilibili.com/video/BV1Xx411R743?spm_id_from=333.999.0.0

二、代码


import socket

def main():
    # 创建套接字tcp_Server_Socket
    tcp_Server_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 绑定本地信息
    tcp_Server_Socket.bind(("",7890))
    # 套接字对象tcp_Server进入监听状态,等待TCP客户端建立链接,最大连接数为1
    tcp_Server_Socket.listen(1)

    while True:
        print("等待一个新的客户端的到来:")
        # 等待TCP客户端的连接
        new_Client_Socket,client_addr = tcp_Server_Socket.accept()
        print("一个新的客户端已经到来:%s" % str(client_addr))

        # 循环目的:为同一个客户端服务多次,直到客户端断开连接
        while True:
            # 进入阻塞态,等待TCP客户端发送字符串(最大1024个字节)过来
            recv_data = new_Client_Socket.recv(1024)
            # 打印信息到控制台
            print("客户端送过来的请求是: %s" % recv_data.decode("utf-8"))
            # 解除阻塞有两种情况:
            if recv_data:
                # 将数据发回去之前增加一个换行
                recv_data += "\n".encode("utf-8") 
                # 将收到的字符串原路返回给TCP客户端 
                new_Client_Socket.sendall(recv_data)
            else:
                print(client_addr,"disconnected") # TCP客户端断开连接,打印信息。
                break

        new_Client_Socket.close()
        print("已经为客户端服务完毕.")
    tcp_Server_Socket.close() #可选,它永远不会被执行

if __name__ == "__main__":
    main()

三、测试代码


3.1、网络调试助手mNetAssist

在ubuntu使用网络调试助手mNetAssist可以方便地测试socket程序,它可以充当TCP服务器,TCP客户端,UDP收发。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2、使用mNetAssist测试socket程序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接着,点击“连接网络”。TCP服务器检测到有TCP客户端连接过来,表示TCP服务器与TCP客户端建立连接成功,可以发送字符串了。
在这里插入图片描述
最后,使用网络调试助手(TCP客户端)发送一串字符串“Hello,World"给TCP服务器。TCP服务器接收到”Hello,World"之后,将"Hello,World返回给TCP客户端。
在这里插入图片描述
在这里插入图片描述
最后,TCP客户端断开连接。TCP服务器会继续等待下一个TCP客户端的连接。
在这里插入图片描述
此时,TCP客户端也可以再次连接TCP服务器。
在这里插入图片描述
至此,使用python3开发的TCP服务器程序完成。

四、socket程序阻塞的位置


先说明一下,new_Client_Socket.recv(1024)就是阻塞的位置。TCP服务器跟TCP客户端建立连接后,TCP服务器会马上进入接收的状态(阻塞),直到TCP客户端发送消息过来(解阻塞)才开始执行后续的程序。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

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