我想使用套接字在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)
这是relvent客户端代码:
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"
答案 0 :(得分:0)
127.0.0.1
是一个环回IP,它不存在于本地计算机之外。如果将服务器套接字绑定到127.0.0.1
,则只有同一台计算机上的客户端才能连接到127.0.0.1
。
如果服务器计算机连接到LAN,并且您希望同一LAN上的客户端连接到服务器套接字,则必须将其绑定到服务器计算机的本地LAN IP,或绑定到0.0.0.0
以绑定到所有可用的本地IP。
如果您希望来自Internet的客户端连接到您的服务器套接字,则必须连接到您的Internet连接的公共IP。
如果您的服务器计算机直接连接到Internet调制解调器,则服务器计算机的LAN IP是调制解调器的Internet IP。这是您将服务器套接字绑定到的IP。但是,如果您的服务器机器位于LAN路由器后面,那么您必须将路由器配置为从路由器的公共IP端口转发入站连接到服务器计算机的LAN IP,然后将服务器套接字绑定到该LAN IP。
当然,如果您的服务器机器有防火墙,请确保所需的端口已打开。
话虽如此,10060是超时错误,而不是连接错误。您显示的客户端代码希望服务器在客户端连接后立即发送消息。但服务器实际上是在发送该消息吗?您显示了对邮件进行排队的代码,但您没有显示实际发送邮件的代码。