赞
踩
netty-socketio 是仿照node.js 实现的socket.io服务端,而io.socket是客户端,这里写两个示例,介绍服务端和客户端怎么写。
首先是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启动参数,可以连接更多的客户端。
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(); } } }
重连没有测试,总体运行下来,这两个是可以进行通信的,运行结果如图所示。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。