基于socketserver的网络编程
0. 写在前面
首先回顾一下,在socketserver
中定义了五种不同的服务器类:
BaseServer
定义了 API,单并非用来实例化和直接使用。TCPServer
使用 TCP / IP 套接字进行通信。UDPServer
使用数据报套接字。UnixStreamServer
和UnixDatagramServer
使用Unix
域套接字,分别继承自TCPServer
和UDPServer
,仅在 Unix 平台上可用。
继承图如下:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
1. socketserver.TCPServer 实例
直接上实例!
1. server side
(1)基于BaseRequestHandler
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
"""
The request handler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# Create the server, binding to localhost on port 9999
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()
另外一种方法:
(2)StreamRequestHandler
import socketserver
class MyHandler(socketserver.StreamRequestHandler):
def handle(self):
self.data = self.rfile.readline().strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
self.wfile.write(self.data.upper())
if __name__ == "__main__":
HOST, PORT = 'localhost', 9999
with socketserver.TCPServer((HOST, PORT), MyHandler) as server:
server.serve_forever()
2. client side
import socket
import sys
HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])
# Create a socket (SOCK_STREAM means a TCP socket)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
# Connect to server and send data
sock.connect((HOST, PORT))
sock.sendall(bytes(data + "\n", "utf-8"))
# Receive data from the server and shut down
received = str(sock.recv(1024), "utf-8")
print("Sent: {}".format(data))
print("Received: {}".format(received))
以上实例有不懂对的可以参考:python基础之socket
3. 命令行操作
3.1 Server
python TCPServer.py
先运行服务端,然后执行客户端,并进行输入
3.2 Client
python TCPClient.py Goodbye is what I want to say
3.3 结果
客户端结果:
Sent: Goodbye is what I want to say
Receive: GOODBYE IS WHAT I WANT TO SAY
服务端结果:
127.0.0.1 wrote:
b'Goodbye is what I want to say'
2. socketserver.UDPServer实例
有需要再总结。
3. 注意点
socketserver 可以让我们很容易的创建简单的TCP服务器。 但是,你需要注意的是,默认情况下这种服务器是单线程的,一次只能为一个客户端连接服务。
如果你想处理多个客户端,可以初始化一个 ForkingTCPServer
或者是 ThreadingTCPServer
对象。可以参考:Python cookbook-11.2 创建TCP服务器
参考:
-
12.6. socketserver — 创建网络服务器 ——偶然发现的一个很好的学习平台,其不必官网的翻译和解释差!
-
socketserver — A framework for network servers——Python官方文档
-
python基础之socket——有一些解释说明