Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/socket:如何将文件发送到另一台位于不同网络上的计算机?_Python_Sockets - Fatal编程技术网

Python/socket:如何将文件发送到另一台位于不同网络上的计算机?

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

如果计算机在同一网络上,下面的代码可以工作。但是,如果这些计算机位于不同的网络上,则连接超时

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()
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上的端口以进行该连接