我在android开发中,遇到一个Socket的问题,我怎么可以保持服务器的永久连接呢,服务器发一段时间的数据之后,出现丢失连接。但是我代码里没有关闭socket,什么都没有关闭。 我在cmd 用telnet连接时候,服务器发一段时间后,在cmd提示说:失去了跟主机的连接。这种情况怎么解决?望指点。怎么在如下代码中改进,谢谢!代码如下:
 // =====================准备数据线程========================
// 新建一个线程连接服务器得到数据
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
String message = "request" + "\r\n";
try {
socket = new Socket(SERVERIP, SERVERPORT);
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);
out.println(message);
out.println(message);
br = new BufferedReader(new InputStreamReader(
socket.getInputStream()), 1024 * 10);
msg = br.readLine();
while (true) {
msg = br.readLine();
Message mess = new Message();
mess.obj = msg;
mess.what = 1;
handler.sendMessage(mess);
}
} catch (Exception e) {
Log.i("errors",e.toString());
}
}
}); // 启动线程
thread1.start();
handler = new Handler() {
public void handleMessage(Message mess) {
switch (mess.what) {
case 1:
msg = (String) mess.obj;
s = msg.split(" ");
for (int i = 0; i < fillMaps.size(); i++) {
HashMap<String, String> map = fillMaps.get(i);
if (map.get("forex").equals(s[0])) {
if (!(map.get("bid").equals(s[1]))) {
map.put("bid", s[1]);
map.put("ask", s[2]);
} else if (!(map.get("ask").equals(s[2]))){
map.put("ask", s[2]);
}
}
}
showCurrencyPair();
break;
default:
break;
}
}
};
}

解决方案 »

  1.   

    嗯,这个问题应该是我觉得,Android在长时间不用时,把你的Activiy对象暂停了,或者是比如说像进入待机一样的状况。我觉得应该是这样,还坐等高人解答。我觉得这个问题处理的时候,你应该把网络链接的函数单独写一个Class处理,不要写在Activiy里,这样能防止Activiy被暂停之后,出现对象不可用的情况了,在类中再写一个函数进行重新连接,在连接成功后设置一个Boolean变量,如果连接断开了,那么就重新连接再发送数据。
    或者你可以定时发送心跳包。以确认连接存在,不存在就重连,再发送数据
      

  2.   

    要想tcp不断,用心跳吧,貌似没别的招。
      

  3.   

    谢谢大家的意见,我已经得到解决。我的解决方法很简单:直接用Timer(计时器)来控制连接服务器。如有问题,可以跟我探讨。呵呵!