我正在尝试用套接字连接多台计算机。我可以在计算机上运行主机和客户端,它们将连接。但是,如果我尝试在另一台计算机上运行客户端,它将无法连接。这是我的主机代码:
import socket
import requests
# NOTES:socket.gethostname()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 1234))
s.listen(5)
print("Searching for available computers...")
while True:
clientsocket, address = s.accept()
print(f"Connection from {address} has been established!")
usr = input("Temporary username for this session: ")
msg = input("Send to client: ")
clientsocket.send(bytes(usr + " says > " + msg, "utf-8"))
break
while True:
msg1 = input("Send to client: ")
clientsocket.send(bytes(usr + " says > " +msg1, "utf-8"))
#w
这是我给客户的代码:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1234))
while True:
msg = s.recv(1028)
print(msg.decode("utf-8"))
怎么了?
答案 0 :(得分:0)
这是因为服务器正在侦听的IP地址是0.0.0.0(本地主机),只有同一台计算机上的程序才能访问该IP地址。将服务器的IP地址更改为socket.gethostbyname(socket.gethostname())
,这将返回计算机的本地IP地址。连接到同一网络的任何人都可以访问该本地IP地址。在客户端代码中,您必须将IP地址更改为从上述函数返回的IP地址。因此,在服务器计算机上运行print(socket.gethostbyname(socket.gethostname()))
,并将客户端连接的IP地址设置为打印值。
答案 1 :(得分:0)
“ 0.0.0.0”部分是正确的(请记住,此配置允许任何IP地址(从WAN和LAN)连接到服务器)。 您必须更改此设置:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1234))
while True:
msg = s.recv(1028)
print(msg.decode("utf-8"))
对此:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("ip of the server", 1234))
while True:
msg = s.recv(1028)
print(msg.decode("utf-8"))
因为socket.gethostname()
命令用于获取在其上运行程序的计算机的ip地址(不是服务器本身...如果未指定,则实际上是这样,客户端无法知道该地址是什么)服务器位于)
p.s。 记得在服务器上打开端口1234 + 请不要使用1028 ...这是一个非常糟糕的数字:请改用1024