使用socket接收服务器推送的消息

本文介绍如何在APP中实现与服务端的长连接,以便接收并解析JSON数据。文章详细展示了使用Socket进行长连接的代码实现过程,并提供了一个处理接收到的消息并展示给用户的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中要实现在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或者不合理的地方,但是正常接收消息并展示是没有问题的,我已经用在项目中了,哪位大牛发现有错误或不合理的地方请指出,感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值