0

我在 python 中有一个服务器端程序,它需要一个图像,并且在使用 python 中的客户端程序进行测试时工作正常。

我想使用颤振将图像发送到该服务器,但我没有这样做..

这是我的服务器端代码

import socket       #server


server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # AF_INET = IP, SOCK_STREAM = TCP
server.bind(('localhost', 1112))  # 127.0.0.1
server.listen()

client_socket, client_address = server.accept()

file = open('2.jpg', "wb")
image_chunk = client_socket.recv(1024)  # stream-based protocol

while image_chunk:
    file.write(image_chunk)
    image_chunk = client_socket.recv(1024)

file.close()
client_socket.close()

我试过使用dio,httpMultiPart

以下是我失败尝试的片段:

  1. MultiPart

     var uri = Uri.parse('https://10.0.2.2:1112');
     var request = MultipartRequest('POST', uri)
       ..files.add(await MultipartFile.fromPath(
           'picture', filePath,
           contentType: MediaType('application', 'jpeg')));
     var response = await request.send();
     if (response.statusCode == 200) print('Uploaded!');
    
  2. Dio

    Dio dio = new Dio();
     FormData formData = new FormData.fromMap({
       "file": await MultipartFile.fromPath(filePath, filename: basename(filePath),
         contentType: MediaType('application', 'jpeg'),)
     });
    await dio.post('https://10.0.2.2:1112', data: formData);
    

我可以创建连接,但无法发送文件。

PS:我几乎没有使用套接字的经验,所以我陷入了困境。

4

2 回答 2

1

问题是您正在尝试通过 HTTP 请求连接到套接字 api(不是 websocket,它们是不同的),并且在服务器端期望获取图像字节,但这不会发生,因为您知道 HTTP 有它自己的规范RFC2616。所以你会得到一些http头和正文。

实际上,您可以将 http 请求发送到套接字,但在服务器端,您必须完成繁重的工作。我的意思是逐行读取http标头,然后读取Transfer-EncodingContent-Length标头以了解如何读取请求的剩余字节,然后解析正文数据。

Content-Length 实体标头指示发送给接收者的实体主体的大小(以字节为单位)。

Transfer-Encoding 标头指定用于将有效负载主体安全地传输给用户的编码形式。

解决方案是:

  1. 在客户端使用 dart 套接字库,然后通过套接字而不是 http 请求发送图像(此链接可能会有所帮助)

  2. 或者像以前一样创建一个RESTFUL API并通过 http 请求发送您的图像。

希望我能帮助你:)

于 2021-03-07T19:32:15.000 回答
0

由于您正在处理 websocket,因此您必须签出这个包web_socket_channel

您首先需要使用与您的套接字通道建立连接

var channel = IOWebSocketChannel.connect(Uri.parse('ws://localhost:1234'));

要收听 websocket 频道的更改,您将使用:

 channel.stream.listen((message) {
    print("NEW MESSAGE");
  });

要将数据发送到您的 websocket 通道,您将使用:

channel.sink.add("your data");

最后,不要忘记使用以下命令关闭您的 websocket 通道流:

channel.sink.close();
于 2021-03-07T16:40:44.230 回答