繁体   English   中英

如何TCP服务器永远服务?

[英]How to TCP server serves forever?


大家好!

我是python网络编程的新手。

我的开发环境如下。

  • Windows 7的
  • Python 3.4

我正在学习“ Python网络编程食谱”。 本书中有ThreadingMixIn套接字服务器应用程序的示例。

本书的代码是用Python 2.7编写的。 因此,我为python 3.4进行了修改。 代码是...

# coding: utf-8

import socket
import threading
import socketserver

SERVER_HOST = 'localhost'
SERVER_PORT = 0  # tells the kernel to pick up a port dynamically
BUF_SIZE = 1024


def client(ip, port, message):
    """ A client to test threading mixin server"""
    # Connect to the server
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))
    try:
        message = bytes(message, encoding="utf-8")
        sock.sendall(message)
        response = sock.recv(BUF_SIZE)
        print("Client received: {0}".format(response))
    finally:
        sock.close()


class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
    """ An example of threaded TCP request handler """
    def handle(self):
        data = self.request.recv(1024)
        current_thread = threading.current_thread()
        response = "{0}: {0}".format(current_thread.name, data)
        response = bytes(response, encoding="utf-8")
        self.request.sendall(response)


class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    """Nothing to add here, inherited everything necessary from parents"""
    pass

if __name__ == "__main__":
    # Run server
    server = ThreadedTCPServer((SERVER_HOST, SERVER_PORT),
    ThreadedTCPRequestHandler)
    ip, port = server.server_address # retrieve ip address

    # Start a thread with the server -- one thread per request
    server_thread = threading.Thread(target=server.serve_forever)

    # Exit the server thread when the main thread exits
    server_thread.daemon = True
    server_thread.start()
    print("Server loop running on thread: {0}".format(server_thread))

    # Run clients
    client(ip, port, "Hello from client 1")
    client(ip, port, "Hello from client 2")
    client(ip, port, "Hello from client 3")

这段代码非常完美。 每个客户端的请求都由新线程处理。 当客户的请求结束时,程序结束。

我想让服务器永远服务。 因此,当其他客户端的请求到达时,服务器将其响应发送到该客户端。

我该怎么办?

感谢您阅读我的问题。

PS:哦,再说一遍。 我总是在我的堆栈溢出帖子中打个招呼。 在预览中,它正常显示。 但是,帖子保存后,第一行总是消失了。 请任何人帮我XD

您的程序退出,因为您的服务器线程是守护程序:

# Exit the server thread when the main thread exits
server_thread.daemon = True

您可以删除该行,也可以在代码底部添加server_thread.join()以防止主线程提早退出。

您将必须在无限循环上运行,并在每个循环上等待来自客户端的某些数据。 这样,连接将保持活动状态。

相同的无限循环使服务器可以接受更多客户端。

但是,您将必须以某种方式检测客户端何时关闭与服务器的连接,因为在大多数情况下不会通知服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM