2016-07-24 114 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