websocket(超簡(jiǎn)易群聊)

依賴

<dependencies>
        <dependency>
            <groupId>org.java-websocket</groupId>
            <artifactId>Java-WebSocket</artifactId>
            <version>1.3.0</version>
        </dependency>
    </dependencies>

服務(wù)端

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author shiyangfan
 * @Date 2020-02-19
 **/
public class ServerDemo extends WebSocketServer {
    private List<WebSocket> webSocketList = new ArrayList<WebSocket>();
    private Map<WebSocket,String> webSocketStringMap = new HashMap<WebSocket, String>();

    public ServerDemo() throws UnknownHostException {
    }
    public ServerDemo(int port) throws UnknownHostException {
        super(new InetSocketAddress(port));
        System.out.println("websocket服務(wù)端啟動(dòng):"+port);
    }
    /**
     * 觸發(fā)連接事件
     */
    @Override
    public void onOpen(WebSocket conn, ClientHandshake clientHandshake) {
        System.out.println("new connection :" + conn.getRemoteSocketAddress().getAddress().getHostAddress());
        webSocketList.add(conn);
    }
    /**
     * 連接斷開時(shí)觸發(fā)關(guān)閉事件
     */
    @Override
    public void onClose(WebSocket conn, int code, String reason, boolean remote) {
        webSocketList.remove(conn);
        for (WebSocket web:webSocketList) {
            web.send(webSocketStringMap.get(conn)+"離開了聊天室");
            webSocketStringMap.remove(conn);
        }
    }
    /**
     * 客戶端發(fā)送消息到服務(wù)器時(shí)觸發(fā)事件
     */
    @Override
    public void onMessage(WebSocket conn, String message) {
        if(message.contains("%nick%")){
            String nickname = message.replace("%nick%","");
            webSocketStringMap.put(conn,nickname);
            //向所有客戶端發(fā)送消息
            for (WebSocket web:webSocketList) {
                web.send(nickname+" 進(jìn)入了聊天室");
            }
        }else{
            for (WebSocket web:webSocketList) {
                web.send(webSocketStringMap.get(conn)+": "+message);
            }
        }
    }
    /**
     * 觸發(fā)異常事件
     */
    @Override
    public void onError(WebSocket conn, Exception e) { }
    /**
     * 啟動(dòng)服務(wù)端
     * @param args
     * @throws UnknownHostException
     */
    public static void main(String[] args) throws UnknownHostException {
        new ServerDemo(9999).start();
    }
}



客戶端

<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <title>websocket 客戶端</title>
  <style>
    ul{
      overflow: scroll;
      width: 400px;
      height: 200px;
      padding-left: 5px;
    }
    li{
      list-style: none;
    }
  </style>
</head>
<body>
  <ul id="rev_info"></ul>
  <input id="send_info" type="text" placeholder="輸入發(fā)送的內(nèi)容,回車">
  <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
  <script type="text/javascript">
    var nickname = ""
    function getNickname(){
      nickname = prompt("請(qǐng)輸入你的昵稱:");
      while(!nickname || nickname.trim()==""){
        nickname = prompt("請(qǐng)輸入你的昵稱:");
      }
    }
    //進(jìn)入聊天室,必須有個(gè)名字
    getNickname();
    // 創(chuàng)建一個(gè) websocket
    var ws = new WebSocket("ws://localhost:9999");
    //連接成功觸發(fā)
    ws.onopen = function () { 
       ws.send("%nick%"+nickname)
    };
    //接收到消息觸發(fā)
    ws.onmessage = function (evt) {
      $("#rev_info").append("<li>" + evt.data + "</li>")
    };
    //關(guān)閉連接觸發(fā)
    ws.onclose = function () { alert("連接已關(guān)閉..."); };
    $("body").bind("keypress", function (e) {
      if ((e.keyCode || e.which) == 13) {
        ws.send($("#send_info").val())
        $("#send_info").val("")
      }
    })
  </script>
</body>
</html>

效果


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容