Socket IO Web實時推送


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;
    }

}
View Code

 

  事件處理類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);
    }

}
View Code

 

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();
        }
    }
}
View Code

 

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'!");
                });
View Code

 

個人溫馨提示:

  java中socket.emit(事件, 此處為org.json.JSONObject對象 )

       JSONObject 的put數據后, json.toString() 順序是亂的

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM