服务端需要使用 netty-socketio ,示例项目 netty-socketio-demo ,基本上看看demo示例项目就能很快上手了,但是demo中的示例代码场景为js做客户端,如果需要在java中连接websocket server,可以参考下面的示例:
package com.me.learn.socket.server;
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener;
import com.corundumstudio.socketio.listener.DataListener;
import io.socket.engineio.client.Socket;
public class DemoSocketServer {
public static void main(String[] args) throws InterruptedException {
Configuration config = new Configuration();
config.setHostname("localhost");
config.setPort(9092);
final SocketIOServer server = new SocketIOServer(config);
server.addConnectListener(new ConnectListener() {
@Override
public void onConnect(SocketIOClient client) {
String token = client.getHandshakeData().getUrlParams().get("token").get(0);
if (!token.equals("8888888")) {
client.disconnect();//校验token示例
}
System.out.println("sessionId:" + client.getSessionId() + ",token:" + token);
}
});
server.addEventListener(Socket.EVENT_MESSAGE, String.class, new DataListener<String>() {
@Override
public void onData(SocketIOClient client, String data, AckRequest ackSender) throws Exception {
System.out.println("client data:" + data);
server.getBroadcastOperations().sendEvent(Socket.EVENT_MESSAGE, "hi");
} });
server.start();
Thread.sleep(Integer.MAX_VALUE);
server.stop();
}}
客户端是需使用 socket.io-client-java
package com.me.learn.socket.client;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
import java.net.URISyntaxException;
public class DemoSocketClient {
public static void main(String[] args) throws URISyntaxException, InterruptedException {
IO.Options options = new IO.Options();
options.transports = new String[]{"websocket"};
options.reconnectionAttempts = 2;
options.reconnectionDelay = 1000;//失败重连的时间间隔
options.timeout = 500;//连接超时时间(ms)//
final Socket socket = IO.socket("http://localhost:9092/?token=123456", options);//错误的token值连接示例
final Socket socket = IO.socket("http://localhost:9092/?token=8888888", options);
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
socket.send("hello");
}
});
socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("连接关闭");
}
});
socket.on("message", new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("sessionId:" + socket.id());
for (Object obj : args) {
System.out.println(obj);
}
System.out.println("收到服务器应答,将要断开连接...");
socket.disconnect();
}
});
socket.connect();
}}
注意:以上实现通讯的代码从开源项目的demo做参考即可实现,这里需要注意的是版本不兼容的问题,正常运行版本要求:netty-socketio 为1.7.x版本 socket.io-client 为1.0.x版本