所以我从Kenneth Lambert的“Fundamentals of Python”一书中学习Python,并且我在书中的一个程序中遇到错误。
这里在第10章讨论客户端和服务器。我的教授要求我们用Python键入这些程序,看看它们是如何工作的。第一个程序运行得很好,但在一个程序中,我收到的错误似乎是Windows错误,而不是Python错误。
这是第339页的程序:
from socket import *
from time import ctime
from threading import Thread
class ClientHandler(Thread):
"""Handles a client request."""
def __init__(self, client):
Thread.__init__(self)
self._client = client
def run(self):
self._client.send(bytes(ctime() + '\nHave a nice day!' , 'ascii'))
self._client.close()
HOST = "localhost"
PORT = 5000
BUFSIZE = 1024
ADDRESS = (HOST, PORT)
server = socket(AF_INET, SOCK_STREAM)
server.bind(ADDRESS)
server.listen(5)
# The server now just waits for connections from clients
# and hands sockets off to client handlers
while True:
print('Waiting for connection')
client, address = server.accept()
print('...connected from:', address)
handler = ClientHandler(client)
handler.start()
当我运行此程序时,它会显示"等待连接" Shell中的消息。但是,当我尝试使用命令提示符连接到该程序时,它会显示以下错误:
C:\Python33>python multi-client-server.py
Traceback (most recent call last):
File "multi-client-server.py", line 30, in <module>
server.bind(ADDRESS)
OSError: [WinError 10048] Only one usage of each socket address (protocol/networ
k address/port) is normally permitted
我们还没有在课堂上研究过这个问题。所以我只是想知道为什么会发生这种情况以及如何解决它。
谢谢!
答案 0 :(得分:2)
所以,根据你的问题:
我们还没有在课堂上研究过这个问题。所以我只是想知道为什么会这样 发生了以及如何解决它。
<强>为什么:强>
您正尝试在Windows操作系统上从两个不同的CMD运行相同的代码段。因此,当您最初执行代码片段时,服务器开始侦听port number 5000
,然后当您从第二个CMD wndow执行相同的代码片段时,它会与第一个已经使用的套接字冲突。
我在Windows 8上测试了这个。
如何解决:
要解决此问题,您必须在第二次执行代码段时使用不同的端口号,以便套接字(IP +端口)不会与前一个冲突。只需编辑代码并放入PORT = 15200
并使用其他名称保存此文件。(我也提供了下面的代码。)现在尝试从CMD窗口执行第一个代码段文件,然后执行第二个代码段文件您现在从第二个CMD窗口创建的。问题将解决!
代码:
from socket import *
from time import ctime
from threading import Thread
class ClientHandler(Thread):
"""Handles a client request."""
def __init__(self, client):
Thread.__init__(self)
self._client = client
def run(self):
self._client.send(bytes(ctime() + '\nHave a nice day!' , 'ascii'))
self._client.close()
HOST = "localhost"
PORT = 15200 # Port number was changed here
BUFSIZE = 1024
ADDRESS = (HOST, PORT)
server = socket(AF_INET, SOCK_STREAM)
server.bind(ADDRESS)
server.listen(5)
# The server now just waits for connections from clients
# and hands sockets off to client handlers
while True:
print('Waiting for connection')
client, address = server.accept()
print('...connected from:', address)
handler = ClientHandler(client)
handler.start()
如果您愿意,请查看here以了解基本的客户端 - 服务器问题。