在Python中的sock.sendall()之后调用sock.recv()
我提供了一个工作的客户机和服务器文件。 客户端向服务器发送图片。 当你发表评论时:在Python中的sock.sendall()之后调用sock.recv(),python,sockets,python-3.x,socketserver,Python,Sockets,Python 3.x,Socketserver,我提供了一个工作的客户机和服务器文件。 客户端向服务器发送图片。 当你发表评论时: data = sock.recv(1024) print("received: ",str(data,"UTF-8")) 图片将不再上载到服务器。。。 (从服务器收到上传消息后,我希望以后再上传一张照片。) 那么,为什么在sock.sendall()之后调用sock.recv()会扰乱通信呢?(我该如何解决它) Client.py: import socket PICLOC = "/home/wr/Docume
data = sock.recv(1024)
print("received: ",str(data,"UTF-8"))
图片将不再上载到服务器。。。
(从服务器收到上传消息后,我希望以后再上传一张照片。)
那么,为什么在sock.sendall()之后调用sock.recv()会扰乱通信呢?(我该如何解决它)
Client.py:
import socket
PICLOC = "/home/wr/Documents/Data/cola_big_1.jpg"
HOST = 'localhost'
PORT = 9995
# Create a socket (SOCK_STREAM means a TCP socket)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# Connect to server and send data
sock.connect((HOST, PORT))
# Send a command to the server
command = "pictureRequest"
data = sock.send(bytes(command, "utf-8"))
pictures = []
pictures.append(PICLOC)
data = sock.recv(1024)
print("received : ",data.decode())
for picture in pictures:
# sending a picture to the server
f = open(picture,'rb').read()
numBytes = len(f)
x = str(numBytes)
print("numBytesToSend: ",x)
data = sock.sendall(f)
'''
data = sock.recv(1024)
print("received: ",str(data,"UTF-8"))
'''
finally:
sock.close()
Server.py
import socketserver
HOST = "localhost"
PORT = 9995
TARGETPICLOC = "/home/wr/Documents/Data/Received/cola_big_1.jpg"
class MyTCPHandler(socketserver.BaseRequestHandler):
def findProduct(self):
"""
Method called to find the product
"""
# Receiving command from the client
msg = "ok to send"
data = self.request.sendall(bytes(msg,"utf-8"))
print("send msg")
# TODO 6 pictures in array !
# Sending a picture from client to server
pictures = []
pictures.append(TARGETPICLOC)
for picture in pictures:
total_data=[]
# open the target picture-file
newFile = open(picture,'wb')
data = self.request.recv(1024)
newFile.write(data)
total_data.append(data)
while len(data)>0 :
data = self.request.recv(1024)
newFile.write(data)
total_data.append(data)
data = b''.join(total_data)
print("#bytes : ",len(data))
newFile.close()
msg = "picture uploaded"
data = self.request.sendall(bytes(msg,"utf-8"))
print("msg send ")
def handle(self):
# Receiving command from the client
data = self.request.recv(1024)
command = str(data,"utf-8")
print("command: ",command)
if command=="pictureRequest" :
self.findProduct()
print("Request ended !!")
if __name__ == "__main__":
HOST, PORT = HOST,PORT
server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
感谢您关注这个问题
那么,为什么在sock.sendall()之后调用sock.recv()会把整个过程搞砸呢
沟通
这仅仅是因为此sock.recv()
调用的客户端等待来自服务器的数据(您打算从服务器接收上传的图片
消息),但服务器陷入了循环中
while len(data)>0 :
data = self.request.recv(1024)
因为recv()
仍在等待来自客户端和块的数据。如果省略了sock.recv()
调用,则客户端将进入sock.close()
;仅在此后,self.request.recv(1024)
返回零长度数据,以便服务器可以在循环时感知传输结束并退出
(我该如何解决它)
您可以在发送图片之前将要发送的字节数(x=str(numBytes)
)发送到服务器,这样服务器就可以在total_data
的长度小于此数时循环