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();
}
原文地址:https://www.cnblogs.com/lindeer/p/11840945.html
- 遇到502错误,invalid request block size 解决方法
- python中json.loads,dumps,jsonify使用
- sqlalchemy和flask-sqlalchemy几种分页操作
- 一个 tflearn 情感分析小例子
- 前端js,后台python实现RSA非对称加密
- 运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist
- ODL应用开发之MD-SAL中级教程
- Sql参数是一个list的最佳实践
- MyBatis 配置输出日志,不输出SQL问题解决
- lombok让你提高代码整洁度的神器附教程及原理分析
- mvn编译的时候一个破错误,google只有3个结果maven : Failed to install metadata project Could not parse metadata maven-
- 读书|《Mastering Machine Learning with Python in Six Steps》
- 几种简单的文本数据预处理方法
- Fiddler中显示IP方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 组复制安装部署 | 全方位认识 MySQL 8.0 Group Replication
- 提升低端设备的 Web 性能
- TypeScript 4.0 RC发布,带来诸多更新
- istio mcp实现探究
- K8S 生态周报| Helm v2 进入维护期倒计时
- Halcon实例转OpenCV:计算回形针方向
- OpenCV检测轮廓极点(Python C++)
- 「Python 正则」使用专题总结
- 如何真正理解好一个「设计模式」?
- 10 行实现最短路算法
- 深度学习Pytorch检测实战 - Notes - 第6章 单阶经典检测器:YOLO
- 从图片裁剪来聊聊前端二进制
- 【投稿】刀哥:Rust学习笔记 2
- 【每周一库】- JWT的Rust实现
- 【Rust日报】2020-08-15 Rust Nightly 标准库文档已涵盖了每个关键字