Java-WebSocket 发送ping

实现主要方法:(注:这里仅执行了一次ping)

WebSocketClient client = new SocketClient(new URI("ws://192.168.0.111:9090"));
if (client.connectBlocking()) {
FramedataImpl1 resp = new FramedataImpl1();
resp.setFin(true);
resp.setOptcode(Framedata.Opcode.PING);
resp.setPayload(ByteBuffer.allocate(0));
client.getConnection().sendFrame(resp);
}

  

备注:SocketClient.java 实现了 WebSocketClient.java,并在onWebsocketPong实现了一个并不稳定的持续ping方法。如果介意,可以注释onWebsocketPong代码,并使用开一个独立线程持续ping的方式来确保稳定性。

import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.framing.Framedata;
import org.java_websocket.framing.FramedataImpl1;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;

public class SocketClient extends WebSocketClient {
public SocketClient(URI serverUri) {
super(serverUri);
}

@Override
public void onWebsocketPing(WebSocket conn, Framedata f) {
// 如果对方发了一个Ping过来,我立刻返回一个Pong消息
FramedataImpl1 resp = new FramedataImpl1(f);
resp.setOptcode(Framedata.Opcode.PONG);
conn.sendFrame(resp);
}

/**
* 如果我的ping发送过去后,对方有答复,则返回一个ping回去,以便实现持续做ping动作
* (缺点:万一没有获取到答复,则会出现中断ping风险)
* @param conn
* @param f
*/
@Override
public void onWebsocketPong(WebSocket conn, Framedata f) {
// 当ping生效后,会返回一个Pong信息,这里接收到Pong后等待一秒后再发送一个ping
System.out.println("接收到ping返回的pong回复");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
FramedataImpl1 resp = new FramedataImpl1(f);
resp.setOptcode(Framedata.Opcode.PING);
conn.sendFrame(resp);
}

@Override
public void onOpen(ServerHandshake handshakedata) {
System.out.println( "opened connection" );
}

@Override
public void onMessage(String message) {
System.out.println( message);
// send(message);
}

@Override
public void onClose(int code, String reason, boolean remote) {
System.out.println( "Connection closed by " + ( remote ? "remote peer" : "us" ) );
}

@Override
public void onError(Exception ex) {
ex.printStackTrace();
}
}

  

 


 
 
 
posted @ 2021-11-12 11:21  蜜铀  阅读(3268)  评论(0编辑  收藏  举报