gpt4 book ai didi

python - 具有多个客户端的简单服务器

转载 作者:行者123 更新时间:2023-11-28 23:04:47 24 4
gpt4 key购买 nike

我正在尝试实现具有多个客户端的简单服务器。它应该从必要的套接字接收数据,处理然后将数据发送给其他客户端。我使用 Python 标准库中的 select 模块。这是服务器:

class ProcessingServer:
def __init__(self, bindaddress="localhost", portname=50001, maxqueue=5):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((bindaddress, portname))
self.socket.listen(maxqueue)
self.inputsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.data = ""

def connect_to_output(self, address, port):
self.inputsocket.connect((address, port))

def start(self):
rsocks = []
wsocks = []
rsocks.append(self.socket)
wsocks.append(self.inputsocket)
self.socket.accept()

while True:
try:
reads, writes, errs = select.select(rsocks, wsocks, [])
except:
return
for sock in reads:
if sock == self.socket:
client, address = sock.accept()
rsocks.append(client)
else:
self.socket.send(self.data)
rsocks.remove(sock)
for sock in writes:
if sock == self.inputsocket:
self.data = sock.recv(512)
wsocks.remove(sock)
print repr(self.data)

这是一个简单的客户端:

import socket
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysocket.connect(("localhost", 50001))
while True:
data = mysocket.recv(512)
print repr(data)
mysocket.close()

接收部分服务器工作正常,但服务器不产生任何输出。我完全没有网络编程经验,感觉好像错过了什么。

最佳答案

您的脚本中有些地方看起来很奇怪。

select 模块的标准用法如下:您有一个套接字来监听连接,每个与客户端的连接都有一个套接字。

首先,只有这个套接字被添加到您的潜在读者列表中,而您的潜在作者列表是空的。

调用 select.select(potential_readers, potential_writers, potential_errors) 将返回 3 个列表: - 套接字准备好阅读 - 准备好写入的套接字 - 套接字错误

在准备读取的套接字列表中,如果该套接字是正在监听连接的套接字,则它必须接受它并将新套接字放入潜在的读取、潜在的写入和潜在的错误中。

如果套接字是另一个套接字,则说明有数据可从该套接字读取。你应该调用 sock.recv(length)

如果你想发送数据,你应该从 select.select 返回的 wlist 中发送它。

errlist 并不经常使用。


现在,对于您的问题的解决方案,您描述协议(protocol)的方式(如果我理解得很好的话)可能如下所示:

import socket, select

sock_producer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_producer.bind(('localhost', 5000))
sock_producer.listen(5)
producers = []

clients = []
sock_consumer_listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Note: different port to differentiate the clients who receive data from the one who sends messages
sock_consumer_listener.bind(('localhost', 5001))

rlist = [sock_producer, sock_listener]
wlist = []
errlist = []

out_buffer = []

while True:
r, w, err = select.select(rlist, wlist, errlist)
for sock in r:
if sock == sock_producer:
prod, addr = sock.accept()
producers.append(prod)
rlist.append(prod)
elif sock == sock_consumer_listener:
cons, addr = sock.accept()
clients.append(cons)
wlist.append(cons)
else:
out_buffer.append(sock.recv(1024))

out_string = ''.join(out_buffer)
out_buffer = []

for sock in w:
if sock in clients:
sock.send(out_string)

我还没有测试过这段代码,所以可能会有一些错误,但这接近于我的做法。

关于python - 具有多个客户端的简单服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7162578/

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