簡體   English   中英

使用 flutter 中的套接字編程將圖像發送到服務器

[英]Sending image to server using socket programming in flutter

我在 python 中有一個服務器端程序,它需要一個圖像,並且在使用 python 中的客戶端程序進行測試時工作正常。

我想使用 flutter 將圖像發送到此服務器,但我沒有這樣做..

這是我的服務器端代碼

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()

我試過使用diohttpMultiPart

以下是我失敗嘗試的片段:

  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:我幾乎沒有使用 sockets 的經驗,所以我堅持這一點。

The problem is that you are trying to connect to a socket api (not websocket these are different) via HTTP request and on server-side expecting to get image bytes but that's not gonna happen because as you know HTTP has it's own specification RFC2616 . 所以你會得到一些 http 接頭和主體。

實際上,您可以將 http 請求發送到套接字,但在服務器端,您必須完成繁重的工作。 我的意思是逐行讀取 http header 然后讀取Transfer-EncodingContent-Length標頭以了解如何讀取請求的剩余字節,然后解析正文數據。

Content-Length 實體 header 指示發送給接收者的實體主體的大小,以字節為單位。

Transfer-Encoding header 指定了用於將有效負載主體安全地傳輸給用戶的編碼形式。

解決方案是:

  1. 在客戶端使用 dart 套接字庫,然后通過套接字而不是 http 請求發送圖像(此鏈接可能會有所幫助)

  2. 或者像以前一樣創建一個RESTFUL API並通過 http 請求發送您的圖像。

希望我能幫助你:)

由於您正在處理 websocket,因此您必須檢查此 package 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 通道 stream 使用:

channel.sink.close();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM