如何从其他设备连接到我的python套接字服务器



我是套接字编程的新手,但在教程的帮助下,我编写了一个简单的服务器和客户端。它有效如果我从服务器运行的同一设备连接到服务器,但如果我尝试从另一个设备连接,它就不起作用。我试着禁用我的防火墙和其他一些类似问题的提示,但它不起作用。

这是服务器:

import threading
import socket
import time
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOSTNAME = socket.gethostbyname(socket.gethostname())
PORT = 50000
print(HOSTNAME, PORT)
s.bind((HOSTNAME, PORT))
s.listen()
clientList = []
def func():
while True:
conn, addr = s.accept()
conn.send(str.encode("Connected"))
print(addr, " connected")
clientList.append(conn)
t = threading.Thread(target=func2, args=(conn, addr,)).start()
def func2(x, y):
print(bytes.decode(x.recv(1024)))
x.send(str.encode("Type your name"))
y = bytes.decode(x.recv(1024))
for z in clientList:
z.send(str.encode(y + " connected"))
while True:
try:
v = bytes.decode(x.recv(1024))
q = str(y)
h = q + " sent: " + v
print(h)
for z in clientList:
z.send(str.encode(h))
if v == "disconnect":
x.send(str.encode("disconnect"))
clientList.remove(x)
x.close()
threading.current_thread()._delete()
break
time.sleep(0.01)
except:
clientList.remove(x)
for z in clientList:
z.send(str.encode(y + " disconnected"))
print(y + " disconnected")
x.close()
threading.current_thread()._delete()
break

func()

这是客户:

import socket
import threading
import time
HOSTNAME = "192.168.56.1" # server local ip
PORT = 8080
def Listen(i):
while True:
try:
k = bytes.decode(i.recv(1024))
if k == "disconnect":
i.close()
threading.current_thread()._delete()
break
print(k)
time.sleep(0.01)
except:
print("Disconnected")
i.close()
threading.current_thread()._delete()
break
def Activate(i):
t = threading.Thread(target=Listen, args=(i,))
t.start()
def InputHandler():
while True:
time.sleep(1)
v = input("")
if v == "connect":
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOSTNAME, PORT))
s.send(str.encode("connected"))
Activate(s)
time.sleep(1)
except:
print("Failed")
elif v == "close":
try:
s.send(str.encode("disconnect"))
break
except:
break
else:
try:
s.send(str.encode(v))
except:
print("Failed")
InputHandler()

有什么想法吗?请让我看看。

据我所知,您所描述的简单情况不应该需要端口转发(也就是说:如果两台机器都在同一个局域网上(。但@AvivYaniv在评论中提供的链接中有一些关于你所问问题的注释,哪些是:

如果你试图从同一个局域网内部连接,有一个非常简单的解决方案:使用服务器的真实内部地址,而不是路由器的外部地址。

您似乎已经知道服务器机器的IP地址是什么,因为在客户端中,您将HOSTNAME变量写为等于192.168.56.1

无论如何,请尝试将服务器的绑定地址设置为空。ie而不是:

HOSTNAME = socket.gethostbyname(socket.gethostname())

尝试:

HOSTNAME = ''

在服务器端。

此外,本教程中还有一些有用的注释,如:

需要注意的几件事是:我们使用了socket.gethostname(),以便套接字对外部世界可见。如果我们使用CCD_ 4或CCD_;服务器";插座,但只有在同一台机器中才能看到。s.bind(('', 80))指定套接字可以通过机器碰巧拥有的任何地址访问。

编辑1:

如果您不使用VM,那么没问题:只需找到服务器机器的IP并放入客户端的HOSTNAME中。如果将服务器的HOSTNAME设置为空,则客户端应连接到服务器的IP。尝试查找您的IP(不是路由器的外部IP,而是服务器的机器LAN IP(。例如,如果您在Windows上,请转到本教程中所示的"控制面板"。

最新更新