【发布时间】:2018-08-11 00:31:50
【问题描述】:
所以,我有一个服务器脚本,它从客户端脚本接收图像,并且应该发送一个“OK”确认。但确认永远不会通过。
服务器脚本 -
import socket,sys
s = socket.socket()
print("Socket successfully created")
port =80
s.bind(('', port))
print("socket binded to %s" %(port))
s.listen(5)
print("socket is listening")
while True:
c, addr = s.accept()
print('Got connection from', addr)
file_name=s.recv(1024)
file_name=fil_ename.decode("utf-8")
with open(file_name,"wb")as f:
while True:
data=c.recv(1024)
if not data:
break
f.write(data)
c.send(bytes('Thank you ! File received.',"utf-8"))
c.close()
客户端脚本 -
import socket
s = socket.socket()
# Define the port on which you want to connect
port = 80
s.connect(('IP address of my server', port))
s.send(bytes("hand.jpeg","utf-8"))
f=open("back.jpeg","rb")
data=f.read(512)
while data:
s.send(data)
data=f.read(512)
f.close()
print(s.recv(10))
服务器没有发送任何确认,似乎卡在了 for 循环中。但是,如果我从服务器脚本中删除c.send(bytes('Thank you ! File received.',"utf-8")) 行,则代码运行良好。此外,如果我从服务器端删除接收部分并只发送确认部分,即 c.send(bytes('Thank you ! File received.',"utf-8")) ,客户端会收到消息。但是,如果如代码所示在服务器端进行接收(图像文件)和确认的组合,则服务器端无法响应。
需要注意的重要一点是,在上述程序的 KeyBoardInterrupt-ing 上,它显示服务器端脚本被挂起/卡在 data=c.recv(1024) 行中。但是如果删除确认行,同样的问题就会消失。
注意:- 客户端脚本在我的本地计算机上运行,而服务器端脚本在 Google Cloud VM 实例上运行。
请帮忙。 谢谢。
【问题讨论】:
标签: python-3.x sockets client-server google-compute-engine python-sockets