在Socket上的写也可以阻塞,特别是如果它是一个TCP套接字。 OS将仅缓冲一定量的未发射(或发射但未确认)的数据。如果你写的东西快于远程应用程序能够读取它,套接字最终会备份,你的写调用将被阻塞。

回应这些后续问题:

So is there a mechanism to set a

timeout for this? I’m not sure what

behavior it’d have…maybe throw away

data if buffers are full? Or possibly

delete older data in the buffer?

没有机制在java.net.Socket上设置写超时。有一个Socket.setSoTimeout()方法,但它影响accept()和read()调用…而不是write()调用。显然,如果你使用NIO,非阻塞模式和一个选择器,你可以得到写超时,但这没有你想象的有用。

正确实现的TCP堆栈不丢弃缓冲的数据,除非连接关闭。然而,当你得到一个写超时时,不确定当前在OS级缓冲区中的数据是否已被另一端接收…。另一个问题是,你不知道你上次写入的数据实际上是传输到操作系统级TCP堆栈缓冲区。没有一些应用程序级协议用于重新同步流*,在写入超时后唯一安全的事情是关闭连接。

相比之下,如果使用UDP套接字,write()调用将不会阻塞任何相当长的时间。但缺点是,如果有网络问题或远程应用程序没有保持,消息将被丢弃在地板上,没有通知任何一端。此外,您可能会发现消息有时会无序地传送到远程应用程序。这将由你(开发人员)来处理这些问题。

*理论上可以这样做,但对于大多数应用程序,在已经可靠(到一点)的TCP / IP流之上实现额外的再同步机制是没有意义的。如果它确实有意义,你还需要处理连接关闭的可能性…所以它会更容易假设它关闭。

java write阻塞_java socket/output stream writes:他们阻塞?相关推荐

  1. java socket readline 阻塞_java Socket readLine() 阻塞

    1,当使用调用 在服务器端调用readLine()的时候,客户端就如果调用的是print()方法就会卡住,而且不会报错,改成println() 就会畅通! 2,如果 socket端 while()循环 ...

  2. java backlog满_java socket参数详解:BackLog

    输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数.如果队列满时收到连接指示,则拒绝该连接. 注意: 1. backlog参数必须是大于 0 的正值.如果传递的值等于或小于 0, ...

  3. java群聊_Java Socket通信实现私聊、群聊

    前言 闲言少叙,上代码! 代码编写 server服务端 /*** 服务端*/ public classServer {private static ServerSocket server = null ...

  4. iterate在java中的_Java 9中Stream API的iterate()方法的重要性?

    在Java 8中,Stream API的iterate()方法将种子和一元运算符作为参数.随着流变得无限,它使开发人员可以通过使用limit,findFirst,findAny等添加显式终止条件.在J ...

  5. java.io设计模式_JAVA IO 设计模式彻底分析

    无论是哪种编程语言,输入跟输出都是重要的一部分,Java也不例外,而且Java将输入/输出的功能和使用范畴做了很大的扩充.它采用了流的机制来实现输入/输出,所谓流,就是数据的有序排列,而流可以是从某个 ...

  6. java 通信 教程_Java实现简单的socket通信教程

    今天学习了一下java如何实现socket通信,感觉难点反而是在io上,因为java对socket封装已经很完善了. 今天代码花了整个晚上调试,主要原因是io的flush问题和命令行下如何运行具有pa ...

  7. connect: 网络不可达_Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    本文转自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

  8. java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...

    本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...

  9. java tcp实现_JAVA 通过 Socket 实现 TCP 编程

    简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...

最新文章

  1. redis实现对账(集合比较)功能
  2. 【原创 HadoopSpark 动手实践 1】Hadoop2.7.3 安装部署实践
  3. TENSORFLOW PROCESS FINISHED WITH EXIT CODE -1073741819 (0XC0000005)
  4. Google 宣布将 Istio 商标转移给 Open Usage Commons | 云原生生态周报 Vol. 57
  5. sql的error如何查看是什么故障_什么是420mA控制回路?常见故障如何排查?
  6. leetcode 64. 最小路径和(递归 / 动态规划解法图解)(Java版)
  7. Data URI scheme 在 html 中嵌入小图片
  8. redis 简单应用
  9. 学生用计算机怎么用视频,19.使用ZOOM作为上课视频、语音和屏幕分享工具,具体对学生的电脑和宽带有什么软件和硬件要求?...
  10. python高手能做什么_python高手们、能不能给新手写点心得,迷茫过、好方法、过渡期等等...
  11. python模拟浏览器下载文件_模拟浏览器下载文件?
  12. git stash (保存当前的工作现场)
  13. 基于Servlet面试题进行JavaWeb入门学习
  14. html计时器插件,jQuery计时器插件TimeCircles
  15. 全桥驱动IR系列参考设计及问题指南
  16. VS2013附加包含目录,添加相对路径
  17. QT入门之布局 水平布局、垂直布局、表单布局、网格布局
  18. ClickME 隐私策略
  19. 腾讯企鹅辅导 H5 性能极致优化
  20. ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry ‘1‘ for key ‘PRIMARY‘

热门文章

  1. java 输入框_Java文本框和文本区的输入输出
  2. MATLAB中的线性插值
  3. Linux中Docker的yum源与镜像加速器
  4. 项目中出现specify @BootstrapWith‘s ‘value‘ attribute or make the default bootstrapper class avail
  5. Tomcat8.5.40启动后一直卡在日志At least one JAR was scanned for TLDs yet contained no TLDs
  6. powerdesigner显示工具面板_Adobe After Effects:如何使用木偶工具
  7. java将Object对象转换成实体类对象
  8. CSS实现间隔线样式
  9. php rabbitmq延迟队列示例
  10. LeetCode20.有效的括号 JavaScript