项目中要实现在APP中接收服务端推送过来的json数据,并解析显示到用户界面。要实现此功能就必须和服务端保持长连接.
常用API:
SocketAddress remoteAddr = new InetSocketAddress("localhost",8000);//设置服务端的ip和端口(也可以在socket的构造中直接设置)
socket.connect(remoteAddr,60000);//毫秒为单位,0表示用于不超时
getInetAddress(): 获得远程服务器的IP 地址.
getPort(): 获得远程服务器的端口.
getLocalAddress(): 获得客户本地的IP 地址.
getLocalPort(): 获得客户本地的端口.
getInputStream(): 获得输入流. 如果Socket 还没有连接, 或者已经关闭, 或者已经通过 shutdownInput() 方法关闭输入流, 那么此方法会抛出IOException.
getOutputStream(): 获得输出流, 如果Socket 还没有连接, 或者已经关闭, 或者已经通过 shutdownOutput() 方法关闭输出流, 那么此方法会抛出IOException.
isClosed(): 如果Socket已经连接到远程主机, 并且还没有关闭, 则返回true , 否则返回false .
isConnected(): 如果Socket曾经连接到远程主机, 则返回true , 否则返回false .
isBound(): 如果Socket已经与一个本地端口绑定, 则返回true , 否则返回false .
socket.close()//关闭socket
下面就我的socket实现的长连接,接收到消息后解析再展示给用户的案例
/**handler中处理接收到的socket消息*/
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
/**socket就是服务端发送的数据*/
final String socket = msg.obj.toString();
Log.e("handler_socket", socket);
}
}
};
/**socket*/
private Socket s
public void startSocket(){
new Thread(new Runable(){
try{
s=new Socket(服务端IP,端口号);
// s.setSotimeout(2000);//设置阻塞时间
InputStreamReader isr=new InputStreamReader(s.getInputStream(),"UTF-8");//获取socket获取到的输入流,并设置编码格式
char[] by=new char[1024]; //一次读1024个字节
while(isr!=null){
int read=isr.read(by);
Message msg = handler.obtainMessage();
msg.what = 1;
/**这里注意:因为读的是1024个字节,但是有可能服务器发送的没有1024个,这样你读到不够的时候系统默认就会打上空格,空格在Log就会是乱码,解决办法就是利用string的构造传入一个输入流,从0开始读取,读完结束,即可去掉所有空格*/
msg.obj = new String(by, 0, read);
handler.sendMessage(msg);// 结果返回给UI处理
}
} catch (SocketTimeoutException e) {
Log.e("socket", "socket连接延时" + e.getMessage());
startSocket();//连接出错时再次调用这个方法,实现重连(也不知道对不对,有错误感谢指出)
} catch (IOException io) {
Log.e("socket", "socket连接失败" + io.getMessage());
io.printStackTrace();
startSocket();//连接出错时再次调用这个方法,实现重连(也不知道对不对,有错误感谢指出)
}
}
}).start;
}
回头看看其实挺简单的,而且总共也没多少代码,可能会有bug或者不合理的地方,但是正常接收消息并展示是没有问题的,我已经用在项目中了,哪位大牛发现有错误或不合理的地方请指出,感谢!