![](/img/trans.png)
[英]sending video stream from server to client using socket programming in python
[英]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()
我試過使用dio
, http
和MultiPart
以下是我失敗嘗試的片段:
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;');
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-Encoding
和Content-Length
標頭以了解如何讀取請求的剩余字節,然后解析正文數據。
Content-Length 實體 header 指示發送給接收者的實體主體的大小,以字節為單位。
Transfer-Encoding header 指定了用於將有效負載主體安全地傳輸給用戶的編碼形式。
解決方案是:
在客戶端使用 dart 套接字庫,然后通過套接字而不是 http 請求發送圖像(此鏈接可能會有所幫助)
或者像以前一樣創建一個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.