我正在构建一个具有自己的高级协议的应用程序,该协议可以在TCP上运行,
因此,我正在使用RawSocket
和RawServerSocket
来处理TCP通信。
我有一个静态类来处理通信以及应该首先响应的消息的逻辑(使用各种消息队列来处理)。
在flutter是单线程的情况下,为了不挂起主UI,我创建了一个Peridic Timer
,它每隔2.5秒检查一次消息队列中是否有新消息(由于套接字的事件侦听器,消息进入队列) ),然后处理消息,并且用户界面似乎运行流畅。
我有一种感觉,如果我要发送大量数据(例如图像或歌曲),由于要从套接字读取事件循环器,我会挂断它。
因此,我尝试创建一个callback function
来处理读/写事件,并使用compute
方法对其进行调用,以使其能够在自己的Isolate
上运行,并在完成后将数据返回给我
Uint8List readFromTcpSocketCallback(Map<String, dynamic> m){
return (m[ConstantValues.tcpSocketDefinitionForMap.toString()] as RawSocket).read(m[ConstantValues.amountReadDefinitionForMap.toString()]);
}
class Communications{
...
static Future<Uint8List> _readAllFromTcpSocket(RawSocket socket, int length)async{
Uint8List finalBufferReceived;
Uint8List buffer;
int amountRead = 0;
do
{
buffer = await compute(readFromTcpSocketCallback, {ConstantValues.tcpSocketDefinitionForMap.toString() : socket,
ConstantValues.amountReadDefinitionForMap.toString() : length - amountRead});
amountRead += buffer.length;
finalBufferReceived.isEmpty ? finalBufferReceived = buffer : finalBufferReceived.addAll(buffer);
}
while(amountRead < length);
return finalBufferReceived;
}
}
很不幸,我遇到了exception
:flutter Illegal argument in isolate message object extends Native Wrapper...
这显然是由于我试图按原样发送RawSocket
导致的,如果我能够将其编码为json字符串或它的某种二进制表示形式,然后在回调函数中对其进行解码这会行得通,但我似乎没有找到建立它的实际方法。
我的问题是:
如何在使用socket
的同时将callback function
发送到compute
?
并且,套接字的Read/Write
操作是由其自己的Isolate
管理的吗?因为如果是,那么我真的不需要使用compute
完全没有
除了颤抖着说compute
只能发送primative types
之外,我无法找到有关此信息。
创建Isolate
并在其send / recv方法中应用复杂的逻辑似乎过于简单,无法建立这样的简单事物。
我真的不明白Flutter团队如何期望我们创建可以在一个线程上平稳运行的应用程序(是的,它们支持异步操作,但是仍然在一个线程上进行管理,这使得大型网络操作确实很痛苦,是如果RawSocket读/写操作未在其他隔离上运行)