Python/socket:如何将文件发送到另一台位于不同网络上的计算机?
如果计算机在同一网络上,下面的代码可以工作。但是,如果这些计算机位于不同的网络上,则连接超时 server.py的代码为:Python/socket:如何将文件发送到另一台位于不同网络上的计算机?,python,sockets,Python,Sockets,如果计算机在同一网络上,下面的代码可以工作。但是,如果这些计算机位于不同的网络上,则连接超时 server.py的代码为: #!/usr/bin/env python3 # -*- coding: utf-8 -*- import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("192.168.1.**", 12345)) s.listen(10) c, addr = s.accept() prin
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("192.168.1.**", 12345))
s.listen(10)
c, addr = s.accept()
print('{} connected.'.format(addr))
f = open("image.jpg", "rb")
datas = f.read(1024)
while datas:
c.send(datas)
datas = f.read(1024)
f.close()
print("Done sending...")
而客户端.py包括:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.1.**", 12345))
f = open("recieved.jpg", "wb")
while True:
datas = s.recv(1024)
while datas:
f.write(datas)
datas = s.recv(1024)
f.close()
break
print("Done receiving")
我读到,问题可能来自调制解调器设置。然后我关闭了server.py连接的网络的防火墙。但是client.py文件所在的计算机仍然无法连接到其他计算机
我该怎么做,才能连接这些计算机
提前感谢。试试这个:
server.py:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import os
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 12345)) #if the clients/server are on different network you shall bind to ('', port)
s.listen(10)
c, addr = s.accept()
print('{} connected.'.format(addr))
f = open("image.jpg", "rb")
l = os.path.getsize("image.jpg")
m = f.read(l)
c.send_all(m)
f.close()
print("Done sending...")
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("server_public_ip", 12345)) # here you must past the public external ipaddress of the server machine, not that local address
f = open("recieved.jpg", "wb")
data = None
while True:
m = s.recv(1024)
data = m
if m:
while m:
m = s.recv(1024)
data += m
else:
break
f.write(data)
f.close()
print("Done receiving")
from port_forwarding import forward_port
客户端.py:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import os
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 12345)) #if the clients/server are on different network you shall bind to ('', port)
s.listen(10)
c, addr = s.accept()
print('{} connected.'.format(addr))
f = open("image.jpg", "rb")
l = os.path.getsize("image.jpg")
m = f.read(l)
c.send_all(m)
f.close()
print("Done sending...")
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("server_public_ip", 12345)) # here you must past the public external ipaddress of the server machine, not that local address
f = open("recieved.jpg", "wb")
data = None
while True:
m = s.recv(1024)
data = m
if m:
while m:
m = s.recv(1024)
data += m
else:
break
f.write(data)
f.close()
print("Done receiving")
from port_forwarding import forward_port
注意:在您的服务器.py上,您正在等待10个客户端,但您只接受一个连接,您应将c,addr=s.accept()
放入循环中
更新:如果客户端/服务器位于根服务器后面,则必须转发根服务器上用于该连接的端口
端口转发:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import os
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 12345)) #if the clients/server are on different network you shall bind to ('', port)
s.listen(10)
c, addr = s.accept()
print('{} connected.'.format(addr))
f = open("image.jpg", "rb")
l = os.path.getsize("image.jpg")
m = f.read(l)
c.send_all(m)
f.close()
print("Done sending...")
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("server_public_ip", 12345)) # here you must past the public external ipaddress of the server machine, not that local address
f = open("recieved.jpg", "wb")
data = None
while True:
m = s.recv(1024)
data = m
if m:
while m:
m = s.recv(1024)
data += m
else:
break
f.write(data)
f.close()
print("Done receiving")
from port_forwarding import forward_port
仅适用于Python2.X
我为自己制作了一个脚本,在每个操作系统上转发端口,但是脚本太长了,你可以抓住它
然后在服务器.py中:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import os
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 12345)) #if the clients/server are on different network you shall bind to ('', port)
s.listen(10)
c, addr = s.accept()
print('{} connected.'.format(addr))
f = open("image.jpg", "rb")
l = os.path.getsize("image.jpg")
m = f.read(l)
c.send_all(m)
f.close()
print("Done sending...")
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("server_public_ip", 12345)) # here you must past the public external ipaddress of the server machine, not that local address
f = open("recieved.jpg", "wb")
data = None
while True:
m = s.recv(1024)
data = m
if m:
while m:
m = s.recv(1024)
data += m
else:
break
f.write(data)
f.close()
print("Done receiving")
from port_forwarding import forward_port
在s=socket.socket###
put之前
forward_port(port, 'description')
别忘了将端口转发脚本放在服务器.py的同一文件夹中您无法覆盖TCP/IP的工作方式。抱歉,你能说得更清楚一点吗?无法直接与不可访问网络上的另一台机器进行通信。你能建议如何间接连接这些机器?请使用第三台两台机器都可以连接的机器。谢谢,但你能详细解释一下吗?s、 connect(((((“192.168.1.++”,12345))#这里您必须通过服务器计算机的公共外部IP地址,而不是本地地址。如何查找公共外部ip地址?谢谢,我将搜索查找外部ip地址。192.168.1.*
是服务器的本地ip,要从internet将客户端连接到服务器,您必须知道服务器的公共ip,您可以在这里找到我编辑的答案,如果您的服务器位于NAT(rooter)之后在阅读您编辑的邮件之前,我按照您的建议更改了代码。然后再次运行程序。但现在我得到了一个连接拒绝错误。这个问题是否与更新后的帖子(即更新)有关:如果客户端/服务器位于rooter之后,则必须转发rooter上的端口以进行该连接