java netty-socketio 与 io.socket的使用
netty-socketio 是仿照node.js 实现的socket.io服务端,而io.socket是客户端,这里写两个示例,介绍服务端和客户端怎么写。
1、服务器端
首先是pom 文件,引用netty-socketio和slf4j-nop这两个库即可。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>l</groupId>
<artifactId>nskse</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>1.7.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
</dependencies>
</project>
服务器端示例代码如下:
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 com.corundumstudio.socketio.listener.DisconnectListener;
import java.util.Map;
public class ServerStart {
public static void main(String [] args){
Configuration config = new Configuration();
config.setHostname("localhost");
config.setPort(9999);
SocketIOServer server = new SocketIOServer(config);
server.addConnectListener(new ConnectListener() {
// 添加客户端连接监听器
public void onConnect(SocketIOClient client) {
//logger.info(client.getRemoteAddress() + " web客户端接入");
//不知道如何与客户端对应,好的办法是自己去写对应的函数
client.sendEvent("connected", "hello");
}
});
//监听客户端事件,client_info为事件名称,-自定义事件
server.addEventListener("client_info", String.class, new DataListener<String>(){
public void onData(SocketIOClient client, String data, AckRequest ackRequest) throws ClassNotFoundException {
//客户端推送advert_info事件时,onData接受数据,这里是string类型的json数据,还可以为Byte[],object其他类型
String sa = client.getRemoteAddress().toString();
String clientIp = sa.substring(1,sa.indexOf(":"));//获取客户端连接的ip
Map params = client.getHandshakeData().getUrlParams();//获取客户端url参数
System.out.println(clientIp+":客户端:************"+data);
}
});
//添加客户端断开连接事件
server.addDisconnectListener(new DisconnectListener(){
public void onDisconnect(SocketIOClient client) {
String sa = client.getRemoteAddress().toString();
String clientIp = sa.substring(1,sa.indexOf(":"));//获取设备ip
System.out.println(clientIp+"-------------------------"+"客户端已断开连接");
//给客户端发送消息
client.sendEvent("advert_info",clientIp+"客户端你好,我是服务端,期待下次和你见面");
}
});
server.start();
while (true){
try {
Thread.sleep(1500);
//广播消息
server.getBroadcastOperations().sendEvent("borcast","are you live?");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
其中,广播消息的写法如下,客户端可以选择需要的消息进行接收:
server.getBroadcastOperations().sendEvent("borcast","are you live?");
如果服务器需要对客户端进行分组,组队,那么需要自己去创建管理client,正确的添加client和正确的删除client,或者有开源库可以实现?
打包方式建议使用jar,这样设置jvm启动参数,可以连接更多的客户端。
2、客户端代码
io.socket的使用介绍较少,这个库开源代码在https://github.com/socketio/socket.io-client-java上面,客户端pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>learn</groupId>
<artifactId>nskc</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>io.socket</groupId>
<artifactId>socket.io-client</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
客户端代码如下:
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
public class AppStart {
public static void main(String [] args){
String url ="http://localhost:9999";
try{
IO.Options options = new IO.Options();
options.transports = new String[]{"websocket"};
options.reconnectionAttempts = 2;
options.reconnectionDelay = 1000;//失败重连的时间间隔
options.timeout = 500;//连接超时时间(ms)
//par1 是任意参数
final Socket socket = IO.socket(url+"?par1=1234", options);
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
public void call(Object... args) {
socket.send("hello");
}
});
//自定义事件
socket.on("borcast", new Emitter.Listener() {
public void call(Object... objects) {
System.out.println("receive borcast data:" + objects[0].toString());
}
});
socket.on("connected", new Emitter.Listener() {
public void call(Object... objects) {
System.out.println("receive connected data:" + objects[0].toString());
}
});
socket.connect();
//循环发送数据
while (true){
socket.emit("client_info"," 客户端在发送数据");
Thread.sleep(2000);
}
}catch (Exception ex){
ex.printStackTrace();
}
}
}
重连没有测试,总体运行下来,这两个是可以进行通信的,运行结果如图所示。