一、前言
使用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客户端发送消息过来(解阻塞)才开始执行后续的程序。