gpt4 book ai didi

python多线程服务器

转载 作者:太空宇宙 更新时间:2023-11-03 13:23:31 25 4
gpt4 key购买 nike

我尝试编写的是一个简单的多线程 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。这是我必须对您的代码进行的第一个更改,以便在同一系统上运行服务器和客户端时获得连接。

另一个问题是您的客户端线程实际上并未启动。由于您需要一个客户端线程类,因此声明和启动它的方法如下:

  1. threading.Thread 的子类。
  2. 为您的行为覆盖 __init__,但首先在基类中调用 __init__
  3. 为线程工作覆盖run
  4. 创建一个实例并调用其start 方法。

另一个问题是如果客户端没有发送任何数据,recv 就会阻塞,所以如果您尝试连接多个客户端,它将卡在客户端列表的循环中。您将需要每个客户端一个线程或使用 select.select 来查询客户端套接字的读/写准备情况。

下面是让单个客户端响应的更改代码,但它需要处理多个客户端。它还需要设置一个协议(protocol)来处理消息。 TCP 是一种流式传输协议(protocol)(无消息边界),因此发送“abc”和“123”可能会导致接收到“abc123”或“ab”和“c123”等。它必须处理关闭连接并从客户端列表中删除客户端对象。

祝你好运!你会学到很多东西,弄清楚如何从头开始做这一切。查看 socketserver.py 库以及示例代码。

srv.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()

clnt.py

import socket
import string

address = ('localhost',22085)
mySocket = socket.socket()

mySocket.connect(address)
print("Connected successfully!")
mySocket.send('blah'.encode())
print(mySocket.recv(1024))

输出(srv.py)

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).

输出(clnt.py)

Connected successfully!
b'Testamundo.\r\n'

关于python多线程服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5520821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com