2016-07-24 111 views
-1


如何TCP服务器永远服务?

大家好!

我是新的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") 

此代码完美无缺。每个客户的请求都由新线程处理。当客户的请求结束时,程序结束。

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

我该怎么办?

谢谢你阅读我的问题。

P.S:哦,多一个。我总是在我的堆栈溢出帖子的顶部打个招呼。预览中显示正常。但是,当帖子保存后,第一行总是消失。请任何人都帮我XD

+0

我没有安装python3,但我没有看到任何可能导致服务器停止的事情。你确定程序退出吗?只是因为你看到python输入提示符>>>并不意味着程序已经停止运行。尝试在底部添加'server_thread.join()'。编辑:我只是意识到你正在使服务器线程守护进程。不要这样做。它在那里说“**主线程退出**时退出服务器线程”。 –

+0

@Rawing,我使用PyCharm作为Python IDE。当代码运行时,它会向我显示此消息。 “处理完成退出码0”。我按照你的建议添加了server_thread.join(),它起作用了!它永远服务! – passion053

+0

@饶,我的天啊!拉你是对的!我刚刚评论了“server_thread.daemon = True”,服务器永远服务没有“server_thread.join()”谢谢拉威。你救了我整整一天!XD – passion053

回答

2

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

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

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

+0

谢谢!你完全指出我的代码的问题! – passion053

0

你将不得不在无限循环上运行,并在每个循环等待一些数据来自客户端。这样连接就会保持活着。

服务器接受更多客户端的同一循环。

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

+0

谢谢你阅读我的问题。你指出了我认为的网络编程的重要部分。 – passion053