zoukankan      html  css  js  c++  java
  • dart: socket error错误一览

    SocketException: OS Error: Broken pipe, errno = 32

    这个错误其实有点迷惑性,很多时候调用栈显示是在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();
    }
    
  • 相关阅读:
    express 项目前后台公用样式 /static/js/bootstrap.min.js
    判断滚动条是否到了底部
    JS如何判断滚动条是否滚到底部
    移动端touch触屏滑动事件、滑动触屏事件监听!
    JS事件监听手机屏幕触摸事件 Touch
    nodejs mysql 连接数据库
    nodejs route的简单使用
    nodejs jade 模板 引擎的使用方法
    nodejs 模板引擎ejs的简单使用(3)
    nodejs 模板引擎ejs的简单使用(2)
  • 原文地址:https://www.cnblogs.com/lindeer/p/11840945.html
Copyright © 2011-2022 走看看