【发布时间】:2017-11-09 05:19:05
【问题描述】:
我正在尝试使用套接字在 python 中创建多连接服务器。不是通过任何真正的协议,而是通过自己定义的协议。
我的服务器使用我的本地 IP (127.0.0.1) 正常运行,现在我希望我的朋友连接但我们不断收到此错误:[Errno 10060] 连接尝试失败,因为连接方没有正确响应一段时间后,或建立连接失败,因为连接的主机没有响应。
我已正确打开端口并将我的服务器 ip 设置为 ipconfig 给出的 ip。我错过了什么或做错了什么?
这是相关的服务器代码:
def initialize():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Setup a server socket
server_port = raw_input("Enter the port to run the server on\n") # Ask the admin for port
while server_port.isdigit() is not True:
server_port = raw_input("Enter the port to run the server on\n")
server_socket.bind((LOCAL_IP, int(server_port))) # Bind the server socket to this computer
inputs.append(server_socket)
terminated = False
while not terminated:
readable_sockets, writable_sockets, error_sockets = select.select(inputs, outputs, []) # check which of the
handle_inputs(readable_sockets, server_socket)
handle_messages(writable_sockets) # this works on my local ip server
# sockets we expect to use are actually free
def handle_inputs(readable_sockets, server_socket):
"""
This functions purpose is to read all inputs given by users, and create new requests accordingly
:param readable_sockets: a list of sockets which are waiting to be read
:param server_socket: the socket of the server
"""
for cur_socket in readable_sockets:
if cur_socket is server_socket:
new_socket, new_ip = server_socket.accept(1)
answers_queue.append(Answer(new_socket, Answer.HND_TYPE, 9, "handshake"))
if new_socket not in outputs:
outputs.append(new_socket)
这是相关的客户端代码:
def main():
my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
my_socket.connect((EXTERNAL_IP, PORT))
data = my_socket.recv(1)
if data == 'H':
print my_socket.recv(int(my_socket.recv(2)))
else:
print "ERRRRRRRRRRRRRRRRR"
【问题讨论】:
-
LOCAL_IP是什么? -
您的代码已损坏:
recv最多读取给定的字节数,而不是这个数字。 -
@Daniel,recv 使用我制定的协议,这就是为什么它是一个硬编码的数字。它确实适用于本地连接
-
10060 是超时错误,而不是连接错误。客户端代码期望服务器在客户端连接后立即发送消息。实际发送该消息的服务器代码在哪里?为什么要在将
new_socket添加到outputs之前对消息进行排队?服务器是否有可能尝试过早发送排队的消息,或者更糟的是忽略它? -
@RemyLebeau 这不太可能,因为服务器在本地连接上正常运行