java Socket 长连接后,如何获取发来的数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Socket 长连接后,如何获取发来的数据相关的知识,希望对你有一定的参考价值。
如何知道有数据发来,如何获取发来数据??也就是说:我在建立的是tcp长连接,连接时不发数据,什么时候想发,我就什么时候发。发的时候对方接收。
用一个死循环等着socket传数据过来,接一次数据循环一次,没有接到数据时,就是自动等待了。 参考技术A 服务器每接受到一个客户端请求会得的一个Socket连接,可以用线程来处理每个Socket;处理逻辑,一直保持连接就行啊,发不发数据都能处理呀。。 参考技术B 服务端用一个死循环堵塞!你不给它指令,永远不会动! 参考技术C 服务器端监听一下就可以了如何干净的实现Android/Java Socket 长连接通信
所谓长连接,它通常包含以下几个关键过程:
轮询的建立
建立轮询的过程很简单,浏览器发起请求后进入循环等待状态,此时由于服务器还未做出应答,所以HTTP也一直处于连接状态中。
2. 数据的推送
在循环过程中,服务器程序对数据变动进行监控,如发现更新,将该信息输出给浏览器,随即断开连接,完成应答过程,实现“服务器推”。
3. 轮询的终止
轮询可能在以下3种情况时终止:
3.1. 有新数据推送
当循环过程中服务器向浏览器推送信息后,应该主动结束程序运行从而让连接断开,这样浏览器才能及时收到数据。
3.2. 没有新数据推送
循环不能一直持续下去,应该设定一个最长时限,避免WEB服务器超时(Timeout),若一直没有新信息,服务器应主动向浏览器发送本次轮询无新信息的正常响应,并断开连接,这也被称为“心跳”信息。
3.3. 网络故障或异常
由于网络故障等因素造成的请求超时或出错也可能导致轮询的意外中断,此时浏览器将收到错误信息。
4. 轮询的重建
浏览器收到回复并进行相应处理后,应马上重新发起请求,开始一个新的轮询周期。
客户端代码片段
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="author" content="hoojo & http://hoojo.cnblogs.com">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<%@ include file="/tags/jquery-lib.jsp"%>
<script type="text/javascript">
$(function ()
window.setInterval(function ()
$.get("$pageContext.request.contextPath/communication/user/ajax.mvc",
"timed": new Date().getTime(),
function (data)
$("#logs").append("[data: " + data + " ]<br/>");
);
, 3000);
);
</script>
</head>
<body>
<div id="logs"></div>
</body>
</html>
服务器端代码
@RequestMapping("/ajax")
public void ajax(long timed, HttpServletResponse response) throws Exception
PrintWriter writer = response.getWriter();
Random rand = new Random();
// 死循环 查询有无数据变化
while (true)
Thread.sleep(300); // 休眠300毫秒,模拟处理业务等
int i = rand.nextInt(100); // 产生一个0-100之间的随机数
if (i > 20 && i < 56) // 如果随机数在20-56之间就视为有效数据,模拟数据发生变化
long responseTime = System.currentTimeMillis();
// 返回数据信息,请求时间、返回数据时间、耗时
writer.print("result: " + i + ", response time: " + responseTime + ", request time: " + timed + ", use time: " + (responseTime - timed));
break; // 跳出循环,返回数据
else // 模拟没有数据变化,将休眠 hold住连接
Thread.sleep(1300);
class ConnectionThread extends Thread
Socket client;
int counter;
public ConnectionThread(Socket cl,int c)
client = cl;
counter= c;
@Override
public void run()
try
String destIP=client.getInetAddress().toString();
int destport =client.getPort();
PrintStream outstream=new PrintStream(client.getOutputStream());
DataInputStream instream=new DataInputStream(client.getInputStream());
String inline=instream.readLine();
//try
catch(IOException e)System.out.println(e);
//run本回答被提问者采纳 参考技术B 看你用什么协议
以上是关于java Socket 长连接后,如何获取发来的数据的主要内容,如果未能解决你的问题,请参考以下文章