自己动手写TCP Server

2020年8月8日 / 43次阅读 / Last Modified 2020年8月8日
socket

TCP Server是很常见的应用,python标准库中提供了socketserver模块可以使用,我们也可以自己写,多线程多进程可以更灵活地控制。

多线程tcp server代码

import socket
import threading


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 12345))
s.listen()


def handle_tcp(sock, addr):
    print("new connection from %s:%s" % addr)
    sock.send(b'Welcome!')

    while True:
        data = sock.recv(1024)
        if not data:
            break
        sock.send(b'Hello, %s!' % data)
    sock.close()


while True:
    sock, addr = s.accept()
    t = threading.Thread(target=handle_tcp, args=(sock, addr))
    t.start()

将threading模块换成multiprocessing模块,就可以实现多进程tcp server

import socket
import multiprocessing as mp


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 12345))
s.listen()


def handle_tcp(sock, addr):
    print("new connection from %s:%s" % addr)
    sock.send(b'Welcome!')

    while True:
        data = sock.recv(1024)
        if not data:
            break
        sock.send(b'Hello, %s!' % data)
    sock.close()


while True:
    sock, addr = s.accept()
    t = mp.Process(target=handle_tcp, args=(sock, addr))
    t.start()

很简单吧。

我们还可以使用一个class来接收新的tcp连接,在__init__函数中做点文章,socketserver模块就是这么干的。

最后说一下s.listen函数,这个函数有个backlog参数,可以定义一个等待连接的队列长度:

socket.listen([backlog])
Enable a server to accept connections. If backlog is specified, it must be at least 0 (if it is lower, it is set to 0); it specifies the number of unaccepted connections that the system will allow before refusing new connections. If not specified, a default reasonable value is chosen.
Changed in version 3.5: The backlog parameter is now optional.

listen函数就不填参数可能是最好的选择。

-- EOF --

本文链接:https://www.pynote.net/archives/2321

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top