概述
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的连接与收发消息并设置心跳所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复