簡體   English   中英

Python /套接字:如何將文件發送到其他網絡上的另一台計算機?

[英]Python/socket: How to send a file to another computer which is on a different network?

如果計算機在同一網絡上,則下面的代碼將起作用。 但是,如果這些計算機在不同的網絡上,則連接超時。

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...")

並且client.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...")

client.py

#!/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")

注意 :在server.py上,您正在等待10個客戶端,但是您只接受一個連接,因此應將c, addr = s.accept()放入while循環中

更新 :如果客戶端/服務器在rooter后面,則必須轉發rooter上用於該連接的端口

端口轉發

僅適用於python 2.X

我已經為自己編寫了一個腳本,可以在每個操作系統上轉發端口,但是腳本太長了,您可以在這里獲取

然后在server.py中

from port_forwarding import forward_port

並且在s = socket.socket ###之前

forward_port(port, 'description')

不要忘了把port_forwarding腳本sever.py的同一個文件夾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM