java socket长连接中解决read阻塞的3个办法_java

解决的方法有3个 :

1 约定发送的数据长度,比如 http的 keepAlive 就是必须依赖这个的 Content-Length
2 设置超时的时间,根据我的经验,只有在Socket级别设置才有效.

复制代码 代码如下:

Socket socket = new Socket(host,port);
socket.setSoTimeout(100); // 如果超过100毫秒还没有数据,则抛出 SocketTimeoutException

3 让发送端发送完数据后,关闭连接。 这个在Http的操作时很常见。

(InputStream如何判断数据已经读取结束)

某些时候无法修改客户端的情况下情况一就只有pass掉了,情况二相对来说比较适合,当阻塞后直接抛出一个异常。情况三不适合长连接,因为整个通信过程中链路是不能中断的,也不能调shutdown结束。其实还有第四种方法:当读取到某些字符就不在往下读取了,比如读取到byebye就break。但是这也需要改客户端代码。选了一种折中的办法-设置超时:

StringBuilder sb = new StringBuilder();
try {
  client.setSoTimeout(500);
  while ((a = client.getInputStream().read(buf)) != -1) {
    sb.append(new String(buf, 0, a));
    if (a != size) {
      break;
    }
  }
} catch (Exception e) {
}
System.out.println(sb);

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, socket长连接
解决read阻塞
socket read 阻塞、php socket read 阻塞、socket readline 阻塞、socketread0 阻塞、socket read 非阻塞,以便于您获取更多的相关知识。

时间: 2024-09-22 04:28:53

java socket长连接中解决read阻塞的3个办法_java的相关文章

server-求 如何在Socket长连接中传参数

问题描述 求 如何在Socket长连接中传参数 package cn.qmhd.socket; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.net.ServerSocket; import java.net.Socket; impor

iOS后台如何保持socket长连接和数据传输

iOS后台如何保持socket长连接和数据传输 工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题: 当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭,因此无法再进行数据的传输: 解决方法: 通过设置以下属性可以保持socket连接和数据的继续传输 1.需要在Info.plist文件中添加UIBackgroundModes中的VOIP键值: 2.设置流属性 CFReadStreamRef和CFWri

socket #-C#SOCKET长连接小数据程序未响应

问题描述 C#SOCKET长连接小数据程序未响应 最近由于业务的需要,Linux系统嵌入式设备往我做的服务程序发送数据. 速度奇慢,而且还是程序无响应.后来自己用C#写了一个客户端用来测试.已经用了线程池,不知道用法对不对.请大家帮忙看下. 服务端: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.N

Socket长连接问题

问题描述 要开发一个Socket接口,以前没接触过Socket,百度了一下看的好乱,我这边是客户端,要求用长连接机制来实现,请问各位大神,如何来实现,最好能有例子参考,场景如下:对方IP:10.1.198.47端口:18899请求示例如下:QryBossLog{020006}{13900000097}{20130701000000}{20130731000000}{200}如何通过Socket长连接方式来得到对方的返回字符串,谢谢 解决方案 解决方案二:看看这个:解决方案三:我刚开始学习的时候也

利用socket长连接做信息报警提示

问题描述 利用socket长连接做信息报警提示 现在在做一个项目,需要用服务器推送技术做一个报警提示,就是只要有没有处理的信息显示,就自动报警

Java实现从字符串中找出数字字符串的方法小结_java

本文实例总结了Java实现从字符串中找出数字字符串的方法.分享给大家供大家参考,具体如下: int start = 0; String numStr = null; for (int j = 0; j < valuesStr.length() - 1; j++) { if (Character.isDigit(valuesStr.charAt(j)) == false && Character.isDigit(valuesStr.charAt(j + 1)) == true) { s

上次java socket 的问题已解决,这次关于trigger问题了

解决|问题 解决问题的方法竟然是: 把BufferWriter换成PrintWrite就可以了,哇靠- 这是怎么回事??难道BufferWriter和BufferReader有冲突?在BufferReader进行readLine()时,BufferWriter无法flush()和close()?怪怪 程序改成这样就没问题了,我的数据同步平台也可以运作了. public class ServerThread extends Thread {    private int port;    publ

socket长连接 1秒50帧数据 xml格式传输 丢帧

问题描述 大概万分之五左右的丢帧,求解 解决方案 解决方案二:用的UDP吧 丢点正常

Java的Swing编程中使用SwingWorker线程模式及顶层容器_java

使用SwingWorker线程模式 谨慎地使用并发机制对Swing开发人员来说非常重要.一个好的Swing程序使用并发机制来创建不会失去响应的用户接口-不管是什么样的用户交互,程序总能够对其给出响应.创建一个有响应的程序,开发人员必须学会如何在Swing框架中使用多线程. 一个Swing开发人员将会与下面几类线程打交道: (1)Initial threads(初始线程),此类线程将执行初始化应用代码. (2)The event dispatch thread(事件派发线程),所有的事件处理代码在