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

时间:2020-08-23 16:17:21

标签: python sockets

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

这是服务器:

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()

有什么想法吗?请让我知道。

1 个答案:

答案 0 :(得分:0)

据我所知,对于您所描述的简单情况,您不需要端口转发 (即:如果两台计算机都在同一LAN上)。 但是,尽管评论中@AvivYaniv提供的链接中有一些有关您所问问题的注释,但这些注释是:

如果您尝试从同一LAN内部进行连接,则有一个非常简单的解决方案:使用服务器的真实内部地址,而不是路由器的外部地址。

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

尽管如此,请尝试将服务器的绑定地址设置为空。即代替:

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

尝试:

HOSTNAME = ''

在服务器端。

this教程中也有一些有用的注释,例如:

需要注意的几件事:我们使用socket.gethostname(),以便套接字对外界可见。如果我们使用过s.bind(('localhost', 80))s.bind(('127.0.0.1', 80)),我们仍然会有一个“服务器”套接字,但是只有在同一台机器中可见。 s.bind(('', 80))指定套接字可以通过计算机碰巧拥有的任何地址访问。

编辑1:

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