[英]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上用於該連接的端口
端口轉發 :
我已經為自己編寫了一個腳本,可以在每個操作系統上轉發端口,但是腳本太長了,您可以在這里獲取
然后在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.