【发布时间】:2021-01-25 04:44:40
【问题描述】:
我正在尝试编写一个脚本来使用套接字通过 Internet 传输图像(代码如下所示)。当我在本地机器上尝试时,代码工作正常,但是当我对连接到同一个 WiFi 网络的 2 台不同的计算机(1 台作为服务器,1 台作为客户端)执行相同操作时,它们甚至没有相互连接让单独传输数据。有人可以帮忙吗?
服务器代码:-
import socket
import base64
import sys
import pickle
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 8487))
s.listen(5)
while True:
# After the Connection is established
(clientsocket, address) = s.accept()
print(f"Connection form {address} has been established!")
# Initiate image conversion into a string
with open("t.jpeg", "rb") as imageFile:
string = base64.b64encode(imageFile.read())
msg = pickle.dumps(string)
print("Converted image to string")
# Send the converted string via socket encoding it in utf-8 format
clientsocket.send(msg)
clientsocket.close()
# Send a message that the string is sent
print("String sent")
sys.exit()
客户端代码:-
import socket, pickle, base64
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 8487))
while True:
data = []
# Recieve the message
while True:
packet = s.recv(1000000)
if not packet:
break
data.append(packet)
print("Message recieved")
# Decode the recieved message using pickle
print("Converting message to a String")
string = pickle.loads(b"".join(data))
print("Converted message to String")
# Convert the recieved message to image
imgdata = base64.b64decode(string)
filename = 'tu.jpeg'
with open(filename, 'wb') as f:
f.write(imgdata)
s.shutdown()
s.close()
【问题讨论】:
-
您是否检查过防火墙上相应的 TCP 端口是否打开?
-
客户端需要连接到服务器的主机名,而不是自己的名字——所以
socket.gethostname()是错误的! -
不需要 b64 或泡菜。只需
clientsocket.sendall(imageFile.read())。
标签: python sockets data-transfer data-transfer-objects