【问题标题】:How can i connect to my python socket server from a different device?如何从不同的设备连接到我的 python 套接字服务器?
【发布时间】:2020-08-24 02:06:32
【问题描述】:

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

这是服务器:

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

任何想法有什么问题吗?请告诉我。

【问题讨论】:

标签: python sockets


【解决方案1】:

据我所知,对于您所描述的简单情况,您不需要端口转发 (即:如果两台机器在同一个局域网上)。 但是,@AvivYaniv 在 cmets 中提供的链接虽然有一些关于您要问的内容的注释:

如果您尝试从同一个 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:

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

【讨论】:

  • 如果我将 HOSTNAME 设置为 "" 我应该为客户端写什么,因为它不起作用。而且我没有使用虚拟机。我安装了一个,但它没有激活。我应该尝试删除它吗?我也试过 socket.gethostname() 也没有用。
  • 编辑:HOSTNAME = "" 有效。我的客户端端口错误,但在其他设备上仍然无法使用。
  • 不,您不需要删除 VirtualBox 或任何虚拟机,因为您没有使用它们。那时根本不需要。如果您不使用 VirtualBox,请不要乱用它。在我编辑的答案中查看我的 Edit 1 标题文本。
  • 您好,感谢您的帮助。我认为它实际上是虚拟机,因为当我删除它时,它显示 192.168.178.94 作为我的 ip,如果我使用它,它可以工作,所以谢谢。
  • 我并不是要删除任何 VM 或 VirtualBox!您可能可以在 Windows 命令提示符中使用更强大的工具,例如 ipconfig,您可以在那里明确地找到所有服务器的 IP。这与 VirtualBox 无关。很抱歉您的虚拟机丢失。 :( 我们可以做到这一点而不用弄乱 VirtualBox。
猜你喜欢
  • 2021-04-04
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 2017-06-24
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多