我是套接字编程的新手,但是在教程的帮助下,我编写了一个简单的服务器和客户端。有用 如果我从运行该服务器的同一设备连接到该服务器,但是如果我尝试从另一台设备连接,则该服务器不起作用。我试图禁用防火墙以及有关类似问题的其他一些提示,但是它不起作用。
这是服务器:
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()
有什么想法吗?请让我知道。
答案 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))
指定套接字可以通过计算机碰巧拥有的任何地址访问。
如果您不使用VM,那么没问题:只需找到服务器计算机的IP,然后将其放入客户端的HOSTNAME
中即可。如果将服务器的HOSTNAME
设置为空,则客户端应连接到服务器的IP。尝试查找您的IP(不是路由器的外部IP,而是服务器的计算机LAN IP)。例如,如果您使用的是Windows,请转到this教程中所示的“控制面板”。