我目前正在我的顫振應用程式中實作一個 tcp 套接字連接,該連接在后臺運行并獲取資料以供應用程式顯示。建立連接作業正常,我也收到了來自服務器的初始訊息,但是,在收到第一條訊息后,onDone我呼叫了該訊息socket.listen()并且流關閉了。
對于正確的實作,我需要保持流活著并交換多條訊息。實際上,計劃是在應用程式在前臺運行時始終保持套接字處于活動狀態。
服務器端不是問題,因為我之前在 C# 上實作了相同的客戶端(我一直在簡單地回圈stream.Read()沒有問題)。
這是我的函式現在的樣子:
_socket = await SecureSocket.connect(_ipAddressServer, _portServer,
onBadCertificate: (X509Certificate c) {
print("Certificate WARNING: ${c.issuer}:${c.subject}");
isSocketConnected = true;
return true;
}).catchError((error, stackTrace) async {
return false;
}).timeout(const Duration(seconds: 5));
print("Connected!");
_socket.setOption(SocketOption.tcpNoDelay, true);
_socket.listen((message) {
_handleSocketMessage(message);
}).onDone(() {
print("Socket done");
});
正如我所說,收到第一條訊息后,onDone立即呼叫,我不再從套接字接收任何訊息。該功能有義務保持與服務器的連接。
有什么建議?
編輯:
也許問題出在其他地方。在里面_handleSocketMessage(message)我實際上是在_socket.write(data)再次呼叫。那是錯誤的方法嗎?我應該將_handleSocketMessage(message)內部稱為隔離嗎?我仍在嘗試在 dart 中掌握多執行緒的竅門,這部分在 C# 中要容易一些,不會說謊。
uj5u.com熱心網友回復:
問題不在于我的監聽方法。實際上是我_socket.write()把事情搞砸了。我的服務器希望我發送一個原始位元組陣列(用 Dart 術語Uint8List)。來自 c# 我認為這_socket.write()與 .NET c# 套接字中的幾乎相同,但它實際上會從你傳入的任何內容向套接字發送一個字串。所以我Uint8List被轉換為字串,我的服務器不知道如何處理它。
我換了_socket.write(payload),_socket.add(payload)一切正常。
uj5u.com熱心網友回復:
我在這里看不到您的代碼有任何問題。我注意到您正在呼叫onDone該函式(message) {...},而我認為您想使用. 當您的代碼運行時,如果我是正確的,在列印“套接字完成”后套接字仍然打開。onDone_socket.listen()
我認為您正在尋找的是:
_socket.listen(
(message) {
_handleSocketMessage(message);
},
onDone: () {
print('Socked done');
},
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/443995.html
