java - 通过 java 中的 websocket 与特定用户进行网络聊天

标签 java javascript html css json

我对 websocket 编程知之甚少,但通过观看 youtube,我制作了一个基本上是群聊的聊天应用程序,但现在我想与特定用户聊天,而不是与整个群组聊天。我知道我必须为每个人生成一个唯一的 ID,但我现在如何连接到另一个人请帮助并告诉我我必须下载的 api??

这是我的代码

ChatroomServerEndPoint.java

package websocket;

import java.io.IOException;

import java.io.StringWriter;

import java.util.Collections;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

import javax.json.Json;

import javax.json.JsonArrayBuilder;

import javax.json.JsonObject;

import javax.json.JsonWriter;

import javax.websocket.OnClose;

import javax.websocket.OnMessage;

import javax.websocket.OnOpen;

import javax.websocket.Session;

import javax.websocket.server.ServerEndpoint;

import org.json.JSONException;


@ServerEndpoint("/chatroomServerEndPoint")

public class ChatroomServerEndPoint {

    static Set<Session> chatroomUsers= Collections.synchronizedSet(new HashSet<Session>());

    private final static HashMap<String, ChatroomServerEndPoint> sockets = new HashMap<>();

      private String myUniqueId;

        private String getMyUniqueId() {
            // unique ID from this class' hash code
            return Integer.toHexString(this.hashCode());
        }


    @OnOpen
    public void handleOpen(Session userSession) throws IOException {
        chatroomUsers.add(userSession);
                System.out.println("user added");                   //user added
            this.myUniqueId = this.getMyUniqueId();

                System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"+ myUniqueId);
                ChatroomServerEndPoint.sockets.put(this.myUniqueId, this);
                System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"+sockets);
    }


    @OnMessage
    public void handleMessage(String message, Session userSession) throws IOException, JSONException{
        String username= (String) userSession.getUserProperties().get("username");
        Iterator<Session> itr=chatroomUsers.iterator(); 
        if(username==null){
            userSession.getUserProperties().put("username", message);
            userSession.getBasicRemote().sendText(buildJsonMessageData("System","You are now connected as  "+message));
        while (itr.hasNext()) (itr.next()).getBasicRemote().sendText(buildJsonUsersData());                     }
        else {

            while (itr.hasNext()) {
                itr.next().getBasicRemote().sendText(buildJsonMessageData(username,message));

            }
        }
    }

    @OnClose
    public void handleClose(Session userSession) throws IOException {
        // TODO Auto-generated method stub
        System.out.println("user logout");
        chatroomUsers.remove(userSession);
        Iterator<Session> itr = chatroomUsers.iterator();
        while (itr.hasNext()) (itr.next()).getBasicRemote().sendText(buildJsonUsersData());
    }

    private String buildJsonUsersData() {

        Iterator<String> itr= getUserNames().iterator();
        JsonArrayBuilder jsonArrayBuilder = Json.createArrayBuilder();

        while (itr.hasNext()) jsonArrayBuilder.add((String)itr.next());

         return Json.createObjectBuilder().add("users", jsonArrayBuilder).build().toString();

    }

private String buildJsonMessageData(String username, String message)
 {

    JsonObject jsonObject=Json.createObjectBuilder().add("message", username+" : "+ message).build();


    StringWriter stringWriter= new StringWriter();
    try (JsonWriter jsonWriter = Json.createWriter(stringWriter)){
        jsonWriter.write(jsonObject);
    }

    return stringWriter.toString();
}


private Set<String> getUserNames()
{
    HashSet<String> returnSet = new HashSet<String>();

    Iterator<Session> itr= chatroomUsers.iterator();
                                            System.out.println("@@@@@@@@@@@@@@@@@@@@@@");

    while (itr.hasNext()) 
    {
        returnSet.add(itr.next().getUserProperties().get("username").toString());
    }

        return returnSet;   
}

}

    enter code here

default.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<script type="text/javascript">

var jsonforlogout;

    //alert("########################");

var websocket =new 
WebSocket("ws://172.16.1.31:8080/ChatWebProject1/chatroomServerEndPoint");

    //alert("$$$$$$$$$$$$$$$$$$$");

websocket.onmessage = function processMessage(message)

{

    var jsonData = JSON.parse(message.data);

    jsonforlogout=jsonData;

    //var user=JSON.parse(username.data);

    console.log(jsonData);          //to print

     if(jsonData.message!=null) messagesTextArea.value += jsonData.message +"\n";
    /* if(jsonData.message=='close'){websocket.close();} */
    if(jsonData.users!=null)
    {
        var usercombo = document.getElementById("usercombo");       //combo
        usercombo.length = 0;

        usersTextArea.value="";
         var i=0;
         while(i<jsonData.users.length) 
        {
             usersTextArea.value += jsonData.users[i] + "\n";
                            //combo
             var comboitem = document.createElement("option"); 
             comboitem.text = jsonData.users[i];//"utsav";//
             comboitem.value = jsonData.users[i];//"10"; 
             usercombo.options.add(comboitem);
             i++;
        }
    }


    //or(i = 0; i < responselist.data.length; i++) {
        /* var i=0;
         while(i<jsonData.users.length) 
        {
         var comboitem = document.createElement("option"); 
         comboitem.text = jsonData.users[i];//"utsav";//
         comboitem.value = jsonData.users[i];//"10"; 
         usercombo.options.add(comboitem);
         i++;
        } */
}

function sendMessage() {
    //alert(messageText.value+ " h1");
    websocket.send(messageText.value);
    messageText.value="";
}
 window.onbeforeunload = function () {
    websocket.onclose = function() {};
    websocket.close();
}; 

/* function logout()
{
    //websocket.send(data)
    messagesTextArea.value +=jsonforlogout.message+ "\n ####logout####" + "\n";
    //document.getElementById("messagesTextArea").value+="logout ####";
    websocket.close();
} */

</script>
<title>Insert title here</title>
</head>
<body>
<div align= "center" style="color:orange;font-size: 8mm;">
    WebChat Server
</div>
<div align="center" >
    <textarea id="messagesTextArea" readonly="readonly" rows="15" cols="70" style="color: red;font-size:15pt;" ></textarea>
    <textarea id="usersTextArea" readonly="readonly" rows="15" cols="20" style="color: blue;font-size:15pt;text-align: center;"></textarea>
    <br>
    <input type="text" id="messageText"  size="50" onkeydown="if (event.keyCode == 13) { sendMessage(); }">
    <input type="button" value="send" onclick="sendMessage();">
    <!-- <input type="button" value="logout" onclick="logout();"> -->
    &nbsp;&nbsp;&nbsp;&nbsp;
    To:<select id="usercombo" name="usercombo" >
        </select>
</div>
</body>
</html>

最佳答案

按照下面的示例代码,您只需将每个用户 session 存储在缓冲区中并使用键/值对获取 session

@ServerEndpoint("/chat") public class CampusianChat { // set to store all the live sessions private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());

// Mapping between session and person name
private static final HashMap<String, String> nameSessionPair = new HashMap<String, String>();

// Getting query params
public static Map<String, String> getQueryMap(String query) {
Map<String, String> map = new HashMap<String, String>();//Maps.newHashMap();
if (query != null) {
        String[] params = query.split("&");
        for (String param : params) {
    String[] nameval = param.split("=");
    map.put(nameval[0], nameval[1]);
        }
}
return map;
}

private String message = "";
private String to = "";
private String from = "";


@OnOpen
public void open(Session session) {
    System.out.println("Connected with session ID "+session.getId()+" : "+session.getQueryString());
    Map<String, String> campusian = getQueryMap(session.getQueryString());
    String campusianName = "";
    if (campusian.containsKey("name")) {
        campusianName = campusian.get("name");
        try {
            campusianName = URLDecoder.decode(campusianName, "UTF-8");
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(CampusianChat.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
        //Mapping session ID with campusian
        nameSessionPair.put(campusianName, session.getId());
        sessions.add(session);
}

@OnMessage
public void message(String message, Session session) {
    //Get Gson string as message
    Gson gson = new Gson();
    Campusian campusian = gson.fromJson(message, Campusian.class);
    //Get the message, from (the sender) and to (the user you are sending the msg to)
    this.message = campusian.getMessage();
    this.from = campusian.getFrom();
    this.to = campusian.getTo();
    System.out.println("From: "+from);
    System.out.println("To: "+to);
    try {
        for (Session s : sessions) {
             //Check for the recepient session id. If it exist send message
            if (nameSessionPair.get(this.to).equals(s.getId())) {
                System.out.print("True");
                Campusian c = new Campusian();
                c.setMessage(this.message);

                //Send message in Gson as string
                s.getBasicRemote().sendText(gson.toJson(c));
                break;
            }
        }

    } catch (IOException ex) {
        Logger.getLogger(CampusianChat.class.getName()).log(Level.SEVERE, null, ex);
    }
}

@OnClose
public void close(Session session) {

}

//该类用于解析Gson字符串 公共(public)课校园{ 字符串消息; 字符串到; 字符串来自;

 public void setMessage(String message) {
   this.message = message;
 }
 public String getMessage() {
  return this.message;
 }
public void setTo(String to) {
   this.to = to;
 }
 public String getTo() {
  return this.to;
 }
public void setFrom(String from) {
   this.from = from;
 }
 public String getFrom() {
  return this.from;
 }
}

关于java - 通过 java 中的 websocket 与特定用户进行网络聊天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29578224/

相关文章:

java - spring + hibernate + c3p0 + ehcache java配置

html - 仅使用 CSS 的自适应 html 布局

html - 垂直居中对齐表格行内的图像 '<tr>'

java - 增加一个unicode字符?

java - IntelliJ IDEA 测试 - 如何显示分支覆盖率

javascript - 如何使用 RegExp 文字作为对象键?

javascript - 用于用 JavaScript 解析的 Golang JSON 编码

javascript - 带有 bootstrap-slider-rails 的 rails

javascript - 使用 CSS 在 CKEditor 中设置预览样式

java - Jogl 2.2.1 Windows 工作教程?