在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
的长度小于此数时循环