我是靠谱客的博主 瘦瘦飞机,最近开发中收集的这篇文章主要介绍Java Socket的连接与收发消息并设置心跳,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

import java.io.*;
import java.net.Socket;

public class SocketUtil extends Thread{
    public Socket socket;
    public boolean running=false; //连接状态
    public long lastSendTime; //最后一次发送数据的时间
    public long lastRevierTime; //最后一次收到数据的时间
    public  String msg ="<?xml version="1.0" encoding="utf-8"?>n" +
            "  <LifeSignRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">n" +
            "  <Header>n" +
            "  <MessageName>LifeSignRequest</MessageName>n" +
            "  <MessageRecordCount>0</MessageRecordCount>n" +
            "  <AppID>PBS</AppID>n" +
            "  <MessageTime>2019-07-10 15:30:20</MessageTime>n" +
            "  </Header>n" +
            "  <Body>n" +
            "  <Source>PBS</Source>n" +
            "  <Target>ASMIS</Target>n" +
            "  </Body>n" +
            "  </LifeSignRequest>";
         public String hosts;
         public int ports;
    public boolean SocekeLogin(String host,int port) throws Exception{
        hosts = host;
        ports = port;
        boolean target=false;
        socket = new Socket(host,port);
        target = socket.isConnected();
        lastSendTime=System.currentTimeMillis();
        lastRevierTime = System.currentTimeMillis();
        running=true;
        new Thread(new KeepAliveWatchDog()).start();  //保持长连接的线程,每隔60秒向服务器发一个保持连接的心跳消息
        new Thread(new ReceiveWatchDog()).start();    //接受消息的线程,处理消息
        return target;
    }

      //停止
    public void stops(){
        if(running)running=false;
    }
    // 发送消息
    public void sendObject(String msg) throws IOException {
        DataOutputStream  os = new DataOutputStream (socket.getOutputStream());
        os.write(msg.getBytes());
        System.out.println(msg);
        os.flush();
    }
    class KeepAliveWatchDog implements Runnable{
        long checkDelay = 100;
        long keepAliveDelay = 60000;
        public void run()  {
            while(running){
                if(System.currentTimeMillis()-lastSendTime > keepAliveDelay){
                    try {
                        SocketUtil.this.sendObject(msg);
                        lastSendTime = System.currentTimeMillis();
                    } catch (IOException e) {
                        e.printStackTrace();
                        try{
                            SocketUtil.this.socket.close();
                            SocketUtil.this.stops();
                            SocketUtil.this.SocekeLogin(hosts,ports);
                        }catch (Exception ee){

                        }
                    }

                }else{
                    try {
                        Thread.sleep(checkDelay);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        SocketUtil.this.stops();
                    }
                }
            }
        }
    }
//接收消息
    class ReceiveWatchDog implements Runnable{
        public void run() {
            long keepAliveDelay = 60000;
            while(running){
                //  距离上一条接收消息的时间超过60秒的话重新连接Socket
                if(System.currentTimeMillis()-lastRevierTime > keepAliveDelay) {
                    try{
                        SocketUtil.this.socket.close();
                        SocketUtil.this.stops();
                        SocketUtil.this.SocekeLogin(hosts,ports);
                    }catch (Exception ee){

                    }
                }else {
                    try {
                        InputStream in = socket.getInputStream();
                        if (in.available() > 0) {
                            DataInputStream ois = new DataInputStream(in);
                            byte[] b = new byte[20960];
                            ois.read(b);
                            System.out.println(new String(b));
                            //收到信息了,所以重置心跳时间
                            lastRevierTime = System.currentTimeMillis();
                            lastSendTime = System.currentTimeMillis();
                        } else {
                            Thread.sleep(10);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        SocketUtil.this.stops();
                    }
                }
            }
        }
    }

}

最后

以上就是瘦瘦飞机为你收集整理的Java Socket的连接与收发消息并设置心跳的全部内容,希望文章能够帮你解决Java Socket的连接与收发消息并设置心跳所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部