• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

dart:socketerror错误一览

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

这个错误其实有点迷惑性,很多时候调用栈显示是在socket.connect的时机出的错,但实际是因为socket已经被对端关闭,而关闭的原因可能是因为发送了错误的数据。

解决:
发送数据时机检查socket连接状态及数据正确性。

Bad state: StreamSink is bound to a stream

这个错误容易发生在调用socket.flush之后,这是因为flush操作是一个future, 如果在这个操作结束之前就向socket中写入数据就会报这个错误。实际上调用socket.close也有可能遇到这种错误。在io_sink.dart里源码如下:

  Future flush() {
    if (_isBound) {
      throw new StateError("StreamSink is bound to a stream");
    }
    ...
  }

  Future close() {
    if (_isBound) {
      throw new StateError("StreamSink is bound to a stream");
    }
    ...
    return done;
  }

解决:
或者写入时机在flush完成之后,需要外部关心写入时机;或者封装socket并持有一个缓冲数据对象,外部写入时判断当前socket状态,如果flush完成则直接socket.add否则写入到缓冲区,flush完成时再发送缓冲的数据, 外部就不用再关心写入时机了。

后者实现显然更复杂,需要一揽子的状态判断和处理操作, 但是把这个复杂留给外部逻辑会让工程整体更复杂。

StreamSink is closed

这个错误虽然直白但需要明确什么时机哪个stream是关闭的。一种情况是发生在和socket进行关联的stream的关闭操作上,如上socket.close是一个future, future结束之前还能够接收数据,如果我们的关联stream的close是和socket.close一个时机,那么当socket.close的future还没有结束这时又有数据从远端过来,调用关联stream的处理操作就会出这个错误。
形如:

void close() {
  _socket.close();
  your_stream.close();
}

void handleData() {
  _socket.listen((data) {
    your_stream.add(yourData(data)); // your_stream可能已经关闭
  });
}

解决:
关联的stream的操作应当在socket.close的future结束之后再关闭。
形如:

void close() async {
  await _socket.close();
  your_stream.close();
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Dartserversidecalldll发布时间:2022-07-18
下一篇:
【Dart学习】--Dart之extends&&implements&&with的用法与区别 ...发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap