一、前言
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 核心技术与实战》。