gpt4 book ai didi

python - 服务器/客户端脚本在 MacOSX 上运行流畅,但在 Ubuntu 上运行失败

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:52 25 4
gpt4 key购买 nike

我和我的同学正在用 Python 为学校项目编写服务器/客户端模型。服务器脚本所做的就是接受来自客户端(在本地主机上运行)的连接,并接收将它们打印到终端窗口的消息。该脚本是在运行 OSX10.7.3 64 位的 Macbook Air 上编写的,并且在这台计算机上可以正常运行,但是当在我同学的 Linux 计算机(Ubuntu 11.04 64 位)或我们计算机实验室的 Linux 计算机(Ubuntu 10.04 32 位)上运行时,它运行起来有些不同.在脚本中,服务器和客户端都设置为非阻塞,并且如上所述这在我的 Mac 上工作正常,但在 Linux 机器上它们就像阻塞一样,不允许从客户端 nr2 发送任何数据,在从客户 nr1 收到任何信息之前。

Python 不应该是一种多平台语言吗?如果不是,调整我们的代码以使其在 MacOS 和 Ubuntu 上都能正常工作的最佳方法是什么?

如果这有点含糊,我很抱歉,但我在下面发布了服务器和客户端脚本中的代码。

顺便说一句,我的 Mac 运行 Python 2.7.1,Ubuntu 11.04 运行 Python 2.7.1+,而 Ubuntu 10.04 运行 Python 2.6.5。

由于我们都是套接字编程的新手并且是 Python 的初学者(因此学校项目和简单的代码 =)),如果有人能以简单的方式详细说明,我们将不胜感激。

首先是 server.py 文件:

import select
import socket
import sys
import threading
import client

class Server:
def __init__(self):
self.host = 'localhost'
self.port = 50000
self.backlog = 5
self.size = 1024
self.server = None
self.threads = []

def openSocket(self):
try:
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind((self.host, self.port))
self.server.listen(5)
print "Listening to port " + str(self.port) + "..."
except socket.error, (value,message):
if self.server:
self.server.close()
print "Could not open socket: " + message
sys.exit(1)

def run(self):
self.openSocket()
self.server.setblocking(0)
input = [self.server,sys.stdin]
running = True
while running:

inputready, outputready, exceptready = select.select(input,[],[], 0.01)

for s in inputready:
c = client.Client(self.server.accept())
self.threads.append(c)
print "Client " + str(c.address) + " connected"
inputready.pop()
for c in self.threads:
try:
data = c.client.recv(self.size)
print data
except socket.error, (value,message):
continue

#close threads
self.server.close()
for c in self.threads:
c.join()

if __name__ == "__main__":
s = Server()
s.run()

然后是client.py文件:

import select
import socket
import sys
import server
import threading

class Client(threading.Thread):
def __init__(self,(client,address)):
threading.Thread.__init__(self)
self.client = client
self.address = address
self.size = 1024

def run(self):
self.client.connect(('localhost',50000))
c.client.setblocking(0)
running = True
while running:

line = sys.stdin.readline()
if line == "exit":
self.client.close()
else:
self.client.sendall(line)

self.client.close()

if __name__ == "__main__":
c = Client((socket.socket(socket.AF_INET, socket.SOCK_STREAM),'localhost'))
c.run()

PS:不要介意某些循环中的缩进。当我复制粘贴我的代码时发生了一些事情。PPS:请注意,在任何一台计算机上运行时我们都不会收到任何错误消息。它只是表现不同。

提前致谢

最佳答案

不可否认,我对非阻塞套接字的经验为零,所以我真的帮不上忙。但是,您描述的行为似乎正是您的代码所做的——服务器接受连接请求,创建一个新的 Client 对象,将其附加到列表中——然后一个接一个地监听同一个列表中的所有客户端。这意味着第一个客户端能够连接并发送消息,但下一个客户端无法连接,因为服务器正在从第一个客户端接收数据。

此外,此代码永远不会到达:

    self.server.close()
for c in self.threads:
c.join()

因为服务器永远不会停止接受请求。更重要的是,您似乎并没有启动线程,您只是在创建它们。

无论如何,如果您像这样修改服务器的运行函数,它应该可以工作:

from threading import Thread #this line is at the top of the file, of course

def run(self):
self.openSocket()
self.running = True #make sure to implement some code that'll actually set this variable to False!
while self.running:
c= client.Client(self.server.accept())
t= Thread(target=self.listenToClient,args=[c])
t.daemon= True #this makes sure to kill the thread when the main thread exits
self.threads.append(t)
t.start()

#close threads
self.server.close()
for c in self.threads:
c.join()

def listenToClient(self, c):
print "Client " + str(c.address) + " connected"
while self.running:
try:
data = c.client.recv(self.size)
if data=='': #if the client disconnected
return
print data
except socket.error, (value,message):
continue

要么我完全错了,要么我不知道为什么您的代码可以在 Mac OSX 上运行。

P.S:确保不要使用 Python 3。这需要一些怪癖。

关于python - 服务器/客户端脚本在 MacOSX 上运行流畅,但在 Ubuntu 上运行失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9383204/

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