请教java socket长连接问题 本帖最后由 ljw714 于 2010-12-27 16:29:20 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为长连接的话,服务端得到的 Socket 是不关的,因此数据一直能读到。只能靠报文长度来控制。 这句我不是很理解。我理解的SOCKET通信应该是客户端发送一次数据,服务端接收,并返回数据。报文长度来控制只是控制服务端要读取客户端的哪些数据来处理。我现在的问题是客户端发起一次请求,服务端要响应一次,而不是客户端发了10次,服务端一次来处理。我现在不清楚长连接是指客户端发起10次,服务端一次响应,还是客户端发一次,服务端响应一次,只是每次的连接都是同一个。说明白一点就是socket.accept()这个监听,是在客户端connect的时候响应呢,还是在write的时候响应? 在TCP这一层,更本不存在什么长连接的概念,这些都是认为造出来的也不知道那个白痴先想出来的.....你想一直保持TCP的连接,有两个方式1.发送带外数据保持连接2.发送心跳报文希望楼主也不要被那些白痴人的概念给吓着了,如果是在HTTP层做应用建议你看看bayeux protocolgood luck for you 发一次 响应一次, 长连接一般是异步的,因为连接不断所以会话都是一个说明白一点就是socket.accept()这个监听,是在客户端connect的时候响应呢,还是在write的时候响应?这个是在客户端connect的时候生成套接字, write的时候 对应的是server的read 那简单的同步短连接就可以了嘛, socket write后 read 完 就关掉,下一次新建个socket 连接 wirte -> read 然后关掉……就这么重复……你这个 是要求消息处理是同步的 我认为想出所谓长连接不是白痴,而是一种创新。以避免好不容易建立好的连接,传输几十个字节就关了,这有点太可惜了。这道理跟基于 TCP 的 JDBC 数据库连接池一样。 那你就不关好了嘛……socket 一直保持建立状态, os write , is read , 定义实例变量就好了 定义好一个完整的消息格式就可以了这个格式可以是定义消息的长度 也可以定义特殊的字符作为消息的开始和结束一个例子如下StringBuffer sb = new StringBuffer(""); byte[] buffer = new byte[1]; System.out.println("------------准备获取返回信息...-----------"); while(buffer[0]!='!'&&-1!=is.read(buffer)) { System.out.println("------------准备获取返回信息.........-----------"); String temp = new String(buffer); sb.append(temp); } System.out.println("return Message is ["+sb.toString()+"]");这个消息的结束符是'!' 一个感叹号。 数组赋值出现问题,求解答 完全平方数问题 java jdk的两个超水的问题 在java中怎么样获取鼠标左键!如何将物体旋转后的效果在相同位置显示出来?(图形是三维) 熟悉JAVA画图的达人乱进 一个简单的问题 2进制转换成10进制问题,高位在后地位在前,应该怎么转换 java与内存分配? JAVA如何读取计算机的IO,请给个例子看看吧! PreparedStatement插入数据时异常: 插入的值对于列过大 使用jwordnet时遇到的一个错误 Jxl关于CellView的用法。。。高人进
这句我不是很理解。我理解的SOCKET通信应该是客户端发送一次数据,服务端接收,并返回数据。报文长度来控制只是控制服务端要读取客户端的哪些数据来处理。我现在的问题是客户端发起一次请求,服务端要响应一次,而不是客户端发了10次,服务端一次来处理。我现在不清楚长连接是指客户端发起10次,服务端一次响应,还是客户端发一次,服务端响应一次,只是每次的连接都是同一个。说明白一点就是socket.accept()这个监听,是在客户端connect的时候响应呢,还是在write的时候响应?
也不知道那个白痴先想出来的.....
你想一直保持TCP的连接,有两个方式
1.发送带外数据保持连接
2.发送心跳报文希望楼主也不要被那些白痴人的概念给吓着了,如果是在HTTP层做应用建议你看看
bayeux protocolgood luck for you
这个是在客户端connect的时候生成套接字, write的时候 对应的是server的read
我认为想出所谓长连接不是白痴,而是一种创新。以避免好不容易建立好的连接,传输几十个字节就关了,这有点太可惜了。这道理跟基于 TCP 的 JDBC 数据库连接池一样。
这个格式可以是定义消息的长度 也可以定义特殊的字符作为消息的开始和结束
一个例子如下
StringBuffer sb = new StringBuffer("");
byte[] buffer = new byte[1];
System.out.println("------------准备获取返回信息...-----------");
while(buffer[0]!='!'&&-1!=is.read(buffer))
{
System.out.println("------------准备获取返回信息.........-----------");
String temp = new String(buffer);
sb.append(temp);
}
System.out.println("return Message is ["+sb.toString()+"]");
这个消息的结束符是'!' 一个感叹号。