最近android项目中有需要用到Socket与服务器连接的项目,自己之前没有使用过Socket套接字这种方案,所以对Socket通信机制就是个也很有限,领导在会议上讲Socket通讯呢就是客户端和服务器端先进行一次握手,双方同意后就可以进行数据传送。我心里最反感别人说这句话如果是大学老师第一次给我们讲Socket概念的话,这话我乐意听。对这有开发经验的程序员竟然还这么跟我介绍Socket,我要的是方案的具体实施我不是问什么概念。C, bs一下。好了愤青完了该介绍项目中Socket通信的方案吧。

  需求:1,一般Socket通信中服务器与客户端的关系都是一对多关系的。而且需要附带一个认证。

关于socket长连接的心跳包

  心跳包:通信双方为保证通信畅通(不被防火墙关闭)或者使对方及时知道是否已经断线(一定时间内没有收到心跳数据视为已经断开)而定期给对方放送的某些特殊标识字符,这个字符可以根据双方自定义。假设对方定义TimeOut时间为60秒则您应在在六十秒之前发送一个数据(心跳)给他,对方收到心跳后,心跳恢复Timeout回复到60秒。比如我们设定“\r\n”为心跳数据,那么我们可以利用TimeTask定期发送这个消息给对方。这样心跳就完成了。例如服务器得到一个Socket        socket.setKeepAlive(true); socket.setOOBInline(true);socket.setSoTimeout(40000);setSoTimeout就是定义心跳时间。如果40秒没有收到任何消息就断开。 在客户段我们用这样的代码给他发心跳



[java] view plain copy


1. /**
2.      * 启动心跳线程
3.      */
4. private void
5. // 启动心跳线程
6. new
7. new
8.   
9. @Override
10. public void
11. // TODO Auto-generated method stub
12. "\r\n", false);  
13.             }  
14.         };  
15. 25000, 25000);  
16.     }


[java] view plain copy


1. private void
2. try
3. "UTF-8"));  
4.         outputStream.flush();  
5. catch
6. // TODO Auto-generated catch block
7.         e.printStackTrace();  
8. catch
9. // TODO Auto-generated catch block
10.         e.printStackTrace();  
11.     }  
12.       
13. }


[java] view plain copy



  1. 这样我们就完成心跳发送了