Python 网络编程:基于socketserver的网络编程

0. 写在前面

首先回顾一下,在socketserver中定义了五种不同的服务器类:

  • BaseServer 定义了 API,单并非用来实例化和直接使用。
  • TCPServer 使用 TCP / IP 套接字进行通信。
  • UDPServer 使用数据报套接字。
  • UnixStreamServerUnixDatagramServer 使用 Unix 域套接字,分别继承自TCPServerUDPServer,仅在 Unix 平台上可用。

源码:socketserver.py

继承图如下:

+------------+
| 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服务器

参考:

  1. 12.6. socketserver — 创建网络服务器 ——偶然发现的一个很好的学习平台,其不必官网的翻译和解释差!
    在这里插入图片描述

  2. socketserver — A framework for network servers——Python官方文档

  3. python基础之socket——有一些解释说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值