2016-05-09 7 views
0

以下はWebSocket用のクライアントサイドスクリプトです。このコードでは、IPアドレスとポートを持つWebSocketsオブジェクトを定義しました。JavaのWebソケットを使用して特定のセッションにメッセージを送信する方法は?

クライアントスクリプト:ここ

var webSocket = 
new WebSocket('ws://localhost:8080/Spring4JSONHandling/websocket'); 
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){ 
var msgAdd = JSON.stringify(jsonData.message); 
     msgAdd = msgAdd.replace(/[&\/\\#,+()$~%.'"*?<>{}]/g, ''); 
     alert("3"+msgAdd); 
     var xyz = msgAdd.split(" : "); 
     var logged = '${me}'; 
     alert("logged" + logged); 
     alert("xyz[0]" + xyz[0]); 
     if (logged == xyz[0]){ 
      alert("1"); 
      $("#chat" + xyz[0]).chatbox("option", "boxManager").addMsg(xyz[0], xyz[1]); 
} else{ 
     alert("2"); 
     $("#chat" + xyz[0]).chatbox("option", "boxManager").addMsg(xyz[0], xyz[1]); 
} 

} 
/* if(jsonData.message=='close'){websocket.close();} */ 
if (jsonData.users != null) 
{ 
document.getElementById("chatusers").innerHTML = ""; 
     var loggedInUser = '${me}'; 
     var i = 0; 
     while (i < jsonData.users.length) 
{ 
var onlineAdd = JSON.stringify(jsonData.users[i]); 
     onlineAdd = onlineAdd.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); 
     if (loggedInUser != onlineAdd){ 

var clone = "<a href='#' onclick=\"clickFun('" + onlineAdd.trim() + "');\" class='usr' data-chat-id='chat" + onlineAdd + "' data-chat-fname='" + onlineAdd + "' data-chat-lname='" + onlineAdd + "'" 
     + " data-chat-status='online' data-chat-alertmsg='' data-chat-alertshow='true' data-rel='popover-hover' data-placement='right' data-html='true'" 
     + " data-content=\"<div class='usr-card'>" 
     + "<img src='Spring4JSONHandling/resources/img/1.png' alt='Jessica Dolof'>" 
     + "<div class='usr-card-content'>" 
     + "<h3>Jessica Dolof</h3>" 
     + "<p>Sales Administrator</p>" 
     + "</div>" 
     + "</div>\"><i></i>" + onlineAdd + "</a>"; 
     $('#chatusers').append(clone); 
} 
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(txt) { 
//alert(messageText.value+ " h1"); 
webSocket.send(txt); 
    // messageText.value = ""; 
} 

window.onbeforeunload = function() { 
webSocket.onclose = function() {}; 
    webSocket.close(); 
}; 

は、サーバーのエンドポイント用のコードです。このコードでは、サーバーエンドポイントを持つWebSocketsオブジェクトを定義しました。

サーバコード:私は別のIP上のユーザーにメッセージを送信するとき

package com.outbottle.controllers; 
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.servlet.http.HttpSession; 
import javax.websocket.EndpointConfig; 

import javax.websocket.OnClose; 
import javax.websocket.OnMessage; 
import javax.websocket.OnOpen; 
import javax.websocket.Session; 
import javax.websocket.server.ServerEndpoint; 


@ServerEndpoint("/websocket")  
public class WebSocketTest { 

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

    private final static HashMap<String, WebSocketTest> 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); 
       WebSocketTest.sockets.put(this.myUniqueId, this); 
       System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"+sockets); 
    } 


    @OnMessage 
    public void handleMessage(String message, Session userSession) throws IOException{ 
     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; 
} 

} 

問題は、同じ名前を持つすべてのユーザーがメッセージを取得し、です。特定のセッションにのみメッセージを送信する必要があります。

答えて

0

handleMessageの機能ですべてのセッションを繰り返すようです。chatroomUsersです。

メッセージを特定のユーザー/セッションにのみ送信する場合は、usernameプロパティをここで確認する必要はありませんか?

関連する問題