[英]python multithreaded server
我正在嘗試編程的是一個簡單的多線程 python 游戲服務器。 在經歷了很多挫折之后,我一直無法弄清楚為什么我的測試客戶端連接超時。 這是我的 server.py 代碼:
import socket
import threading
import clientThread
import struct
import string
class Server:
def __init__(self):
self.HOST = 'localhost'
self.PORT = 22085
self.BUFFIZE = 1024
self.ADDRESS = (self.HOST,self.PORT)
self.clientList = []
input("Press enter to start the server. . .")
self.running = True
self.serverSock = socket.socket()
self.serverSock.bind(self.ADDRESS)
self.serverSock.listen(2)
self.clientThread = clientThread.clientThread(self)
print("Starting client thread. . .")
self.clientThreadObj = threading.Thread(target = self.clientThread.start, args = (self))
print("Awaiting connections. . .")
while self.running:
clientInfo = self.serverSock.accept()
print("Client connected from %s." % clientInfo[1])
# Append to clientThread list...
self.serverSock.close()
print("- end -")
serv = Server()
服務器啟動現有連接的線程並開始偵聽。 為現有連接構建的線程clientThread
循環遍歷客戶端對象列表,這些對象現在什么都不做,它們只是架構。 這是 clientThread.py
import socket
import threading
import struct
import string
class clientThread:
def __init__(self, serv):
self.server = serv
self.clientList = []
self.running = True
print("Client thread created. . .")
def start(self):
print("Beginning client thread loop. . .")
while self.running:
for client in self.clientList:
message = client.sock.recv(self.server.BUFFSIZE)
if message != None and message != "":
client.update(message)
最后,非常簡單的客戶端對象:
import string
class clientObject:
def start(self,clientInfo):
self.sock = clientInfo[0]
self.address = clientInfo[1]
def update(self,message):
self.sock.send("Testamundo.\r\n".encode())
現在,這里的問題是我的客戶端甚至無法連接到我的服務器。 它只是超時。 這是我的簡單客戶端測試的代碼:
import socket
import string
address = ("192.168.1.1",22085)
mySocket = socket.socket()
mySocket.connect(address)
print("Connected successfully!")
這在連接到地址的線路上返回,“連接嘗試失敗,因為連接方在一段時間后沒有正確響應,或者建立連接失敗,因為連接的主機沒有響應。”
有什么建議? 謝謝! 抱歉所有這些代碼,我不確定是否需要全部發布,所以我認為它不會造成太大傷害。
你有兩個系統嗎? 服務器系統的IP是否為192.168.1.1? 如果您只有一個系統,則本地主機地址為 127.0.0.1。 這是在同一系統上運行服務器和客戶端時我必須對您的代碼進行的第一次更改以獲得連接。
另一個問題是您的客戶端線程實際上並未啟動。 既然你想要一個客戶端線程類,下面是如何聲明和啟動它:
__init__
,但首先在基類中調用__init__
。run
。start
方法。 另一個問題是,如果客戶端沒有發送任何數據,則recv
阻塞,因此如果您嘗試連接多個客戶端,它將掛在客戶端列表上的循環中。 每個客戶端需要一個線程或使用select.select
來查詢客戶端套接字的讀/寫准備情況。
下面是讓單個客戶端響應的更改代碼,但它需要處理多個客戶端。 它還需要建立一個協議來處理消息。 TCP 是一種流協議(無消息邊界),因此發送“abc”和“123”可能會導致接收“abc123”或“ab”和“c123”等。它必須處理關閉連接並從客戶端列表中刪除客戶端對象。
祝你好運! 你會學到很多,弄清楚如何從頭開始做這一切。 查看socketserver.py
庫以及示例代碼。
import socket
import threading
import struct
import string
class clientThread(threading.Thread):
def __init__(self, serv):
threading.Thread.__init__(self)
self.server = serv
self.clientList = []
self.running = True
print("Client thread created. . .")
def run(self):
print("Beginning client thread loop. . .")
while self.running:
for client in self.clientList:
message = client.sock.recv(self.server.BUFFSIZE)
if message != None and message != "":
client.update(message)
class clientObject(object):
def __init__(self,clientInfo):
self.sock = clientInfo[0]
self.address = clientInfo[1]
def update(self,message):
self.sock.send("Testamundo.\r\n".encode())
class Server(object):
def __init__(self):
self.HOST = 'localhost'
self.PORT = 22085
self.BUFFSIZE = 1024
self.ADDRESS = (self.HOST,self.PORT)
self.clientList = []
input("Press enter to start the server. . .")
self.running = True
self.serverSock = socket.socket()
self.serverSock.bind(self.ADDRESS)
self.serverSock.listen(2)
self.clientThread = clientThread(self)
print("Starting client thread. . .")
self.clientThread.start()
print("Awaiting connections. . .")
while self.running:
clientInfo = self.serverSock.accept()
print("Client connected from {}.".format(clientInfo[1]))
self.clientThread.clientList.append(clientObject(clientInfo))
self.serverSock.close()
print("- end -")
serv = Server()
import socket
import string
address = ('localhost',22085)
mySocket = socket.socket()
mySocket.connect(address)
print("Connected successfully!")
mySocket.send('blah'.encode())
print(mySocket.recv(1024))
Press enter to start the server. . .
Client thread created. . .
Starting client thread. . .
Beginning client thread loop. . .
Awaiting connections. . .
Client connected from ('127.0.0.1', 52850).
Connected successfully!
b'Testamundo.\r\n'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.