1服務器pom.xml引入
<!-- 服務端 --> <dependency> <groupId>com.corundumstudio.socketio</groupId> <artifactId>netty-socketio</artifactId> <version>1.7.7</version> </dependency> <!-- 客戶端 --> <dependency> <groupId>io.socket</groupId> <artifactId>socket.io-client</artifactId> <version>1.0.0</version> </dependency>
2:編寫服務端程序 ServerDemo.java
package com.gwzx.gwzxyw.socket.test; import org.apache.log4j.Logger; import com.corundumstudio.socketio.AuthorizationListener; import com.corundumstudio.socketio.Configuration; import com.corundumstudio.socketio.HandshakeData; import com.corundumstudio.socketio.SocketIOClient; import com.corundumstudio.socketio.SocketIOServer; import com.corundumstudio.socketio.listener.ConnectListener; import com.corundumstudio.socketio.listener.DisconnectListener; import com.gwzx.gwzxyw.socket.SocketManager; public class ServerDemo { private static Logger logger = Logger.getLogger(ServerDemo.class); public static void main(String[] args) { try { Configuration config = new Configuration(); config.setHostname("localhost"); config.setPort(9093); //此處做token認證 config.setAuthorizationListener(new AuthorizationListener() { @Override public boolean isAuthorized(HandshakeData data) { System.out.println(data); return true; } }); SocketIOServer server = new SocketIOServer(config); CharteventListener listner = new CharteventListener(); listner.setServer(server); // chatevent為事件名稱 server.addEventListener("chatevent", ChatObject.class, listner); // 連接監聽器 server.addConnectListener(new ConnectListener() { @Override public void onConnect(SocketIOClient client) { SocketManager.clietMap.put(client.getSessionId(), client); logger.info("連接:SessionId=" + client.getSessionId() + ", 總數con:" + SocketManager.clietMap.size()); } }); // 斷開監聽器 server.addDisconnectListener(new DisconnectListener() { @Override public void onDisconnect(SocketIOClient client) { // TODO Auto-generated method stub SocketManager.clietMap.remove(client.getSessionId()); logger.info("斷開:SessionId=" + client.getSessionId() + ", 總數dis:" + SocketManager.clietMap.size()); } }); // 啟動服務 server.start(); Thread.sleep(Integer.MAX_VALUE); server.stop(); } catch (Exception e) { e.printStackTrace(); } } }
消息實體類 ChatObject.java

package com.gwzx.gwzxyw.socket.test; import java.io.Serializable; public class ChatObject implements Serializable { /** * */ private static final long serialVersionUID = 8027556976083577023L; private String userName; private String message; public ChatObject() { } public ChatObject(String userName, String message) { this.userName = userName; this.message = message; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
事件處理類CharteventListener.java

package com.gwzx.gwzxyw.socket.test; import com.corundumstudio.socketio.AckRequest; import com.corundumstudio.socketio.SocketIOClient; import com.corundumstudio.socketio.SocketIOServer; import com.corundumstudio.socketio.listener.DataListener; public class CharteventListener implements DataListener<ChatObject> { SocketIOServer server; public void setServer(SocketIOServer server) { this.server = server; } @Override public void onData(SocketIOClient client, ChatObject data, AckRequest ackSender) throws Exception { // TODO Auto-generated method stub // chatevent為 事件的名稱,data為發送的內容 System.out.println("服務器收到 "+ data.getUserName() +" 消息:"+data.getMessage()); System.out.println("服務器廣播消息給borad事件"); data.setMessage("server"); this.server.getBroadcastOperations().sendEvent("broad", data); } }
3:編寫 JAVA 客戶端

package com.gwzx.gwzxyw.socket.test; import io.socket.client.IO; import io.socket.client.Socket; import io.socket.emitter.Emitter; import org.json.JSONException; import org.json.JSONObject; public class ClientDemo { private static Socket socket = null; public static void main(String[] args) { try { IO.Options opts = new IO.Options(); opts.query = "token=123456"; //傳參數 socket = IO.socket("http://localhost:9093", opts); socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @Override public void call(Object... args) { System.out.println("客戶端連接成功"); JSONObject json = new JSONObject(); try { json.put("userName", "gmh"); json.put("message", "gmh"); } catch (JSONException e) { e.printStackTrace(); } System.out.println("客戶端發送測試數據:" + json.toString()); socket.emit("chatevent", json); } }).on("broad", new Emitter.Listener() { @Override public void call(Object... args) { JSONObject obj = (JSONObject)args[0]; System.out.println("客戶端 收到 服務器broad事件數據:" + obj); } }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() { @Override public void call(Object... args) { System.out.println("disconnect"); } }); socket.connect(); } catch (Exception e){ e.printStackTrace(); } } }
4:編寫 JS 客戶端, 當然需要下載socket.io.js 連接http://www.bootcdn.cn/socket.io/

var socket = io.connect('locahost:9093',{query: 'token=123456'}); socket.on('connect', () => { console.log("Client connect=====>socket id:" + socket.id); socket.emit('chatevent', { userName : "123", message : "測試" }); }); socket.on('broad', function (data) { console.log(data); }); socket.on('disconnect', function () { console.log("Client disconnected!"); }); socket.on('reconnect', function () { console.log("Client reconnected!"); }); socket.on('reconnecting', function () { console.log("Client reconnecting'!"); });
個人溫馨提示:
java中socket.emit(事件, 此處為org.json.JSONObject對象 )
JSONObject 的put數據后, json.toString() 順序是亂的