質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

6931閲覧

WebSocketで1対1でのやりとりをしたいが、他のユーザーにも反映されてしまう。

Sfidante

総合スコア90

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2015/08/18 06:31

編集2022/01/12 10:55

WebSocketを用いてチャットをおこないたいと考えております。
JavaとJavaScriptでやりとりの処理を書いております。

現状は、一人がメッセージを送信すると、
WebSocketに接続されている人
全員に反映されてしまっています。

コードを見てもOnOpenしたsessionid全てに対して、
OnMessageで送信しているのは明らかなのですが、
どのように対象を定めればいいのか検討がついておりません。
何卒お力添えのほどよろしくお願いいたします。

下記がJavaとJavaScriptのソースコードになります。

Java

1public class WebSocketEndpointAction{ 2 public static Queue<Session> sessions = new ConcurrentLinkedQueue<Session>(); 3 private HttpSession httpSession; 4 private String sessionid; 5 6 @OnOpen 7 public void onOpen(Session session , EndpointConfig config) { 8 // 開始時 9 sessions.add(session); 10 this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName()); 11 sessionid = httpSession.getId(); 12 } 13 14 15 @OnMessage 16 public void onMessage(String message , Session sessionID) throws IOException, ServletException { 17 // クライアントからの受信時 18 MessageDao messagedao = new MessageDao(); 19 try{ 20 messagedao.connect(); 21 int userid = messagedao.selectSessionID(sessionid).getUserid(); 22 int roomid = messagedao.selectSessionID(sessionid).getRoomid(); 23 messagedao.insertMessage(userid, roomid, message); 24 messagedao.close(); 25 }catch(Exception e){ 26 e.printStackTrace(); 27 } 28 for (Session session : sessions) { 29 session.getBasicRemote().sendText("{\"command\":\"message\", \"text\": \"" + message.replace("\\", "\\\\").replace("\"", "\\\"") + "\" , \"sessionid\": \"" + sessionid + "\"}"); 30 } 31 }

JavaScript

1var webSocket; 2window.onload = function() { 3 var forRtoA = document.createElement('a'); 4 forRtoA.href = "loadMessage"; 5 webSocket = new WebSocket(forRtoA.href.replace("http://", "ws://").replace("https://", "wss://")); 6 var messageArea = document.getElementById("message-list"); 7 var sessionid = document.getElementById("sessionID").value; 8 var photo = document.getElementById("yourphoto").value; 9 10 var appendMessage = function(value, session) { 11 var messageElement = document.createElement("message-list"); 12 var time = new Date(); 13 var month = time.getMonth() + 1; 14 if(month < 10) { month = "0" + month; } 15 var day = time.getDate(); 16 if(day < 10) { day = "0" + day; } 17 var hour = time.getHours(); 18 if(hour < 10) { hour = "0" + hour; } 19 var minute = time.getMinutes(); 20 if(minute < 10) { minute = "0" + minute; } 21 var now = month + "/" + day + " " + hour + ":" + minute; 22 if(session == sessionid){ 23 messageElement.innerHTML = '<li class="msg_send"><div class="inner-box"><p class="balloon_right" id="messageArea">' + value + '</p></div></li><p class="time_send text10">' + now + '</p>'; 24 }else{ 25 messageElement.innerHTML = '<li class="msg_recieve"><a><img src="' + photo + '" alt="メッセージ相手写真" class="c-message_photo img-circle c-photo_mini"></a><div class="inner-box2"><p class="balloon_left">' + value + '</p></div></li><p class="time_recieve text10">' + now + '</p>'; 26 } 27 messageArea.appendChild(messageElement); 28 var message_box = document.getElementById("message_box"); 29 message_box.scrollTop = message_box.scrollHeight; 30 } 31 32 webSocket.onmessage = function(message) { 33 var data = JSON.parse(message.data); 34 appendMessage(data.text, data.sessionid); 35 } 36 37 var messageInput = document.getElementById("c-btn_chenge"); 38 var messageText = document.getElementById("messageInput"); 39 messageText.onkeypress = function(e) { 40 if (13 == e.keyCode) { 41 var message = messageText.value; 42 if (webSocket && "" != message) { 43 webSocket.send(message); 44 messageText.value = ""; 45 return false; 46 } 47 } 48 } 49 50 messageInput.onclick = function() { 51 var message = messageText.value; 52 if (webSocket && "" != message) { 53 webSocket.send(message); 54 messageText.value = ""; 55 } 56 } 57}

何卒、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

受け取るメッセージもJSONにして、java側でJSON.PARSE でマップに変換後、ブロードキャストか、特定ユーザ宛てのメッセージなのか判断したら良いんじゃないでづか。
{ text: "佐藤さん今日は、", broadcast: true, sessid: "xxxxxxxxxxxxxxx" }
こーゆのをjavascript でメッセージで送信、java#onMessage で受信、
json.parse(messageText) したら、bloadcast が true なら全員へメッセージ送信、false ならsessid に相手のセッションが入ってるので、sessions から検索した相手に送信。

ipad で 画面のフルキーボードで入力してるので、サンプルはありません。

以上です。

投稿2015/08/19 14:38

iPadfromto

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コードを読んでみましたが、どんな時も全てのセッションに対してメッセージを送っていませんか?

例えば、チャットルーム毎にメッセージを送りたいのであれば、RoomIdからSessionIDを辿れると思うので、そうしてたどったSessionに対してメッセージを送れば部屋ごとにメッセージが送れます。

1対1でメッセージをやりとりするのも同様に、メッセージを送りたい人のSessionが分かれば、そこに対してメッセージを送るのはどうでしょうか?

投稿2015/08/18 08:33

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sfidante

2015/08/18 09:13

ご回答ありがとうございます。 大変申し訳無いのですが、その処理の方法が全くわかっておりません。 OnOpen時にすべてのセッションが格納されており、そこから該当するSessionIDを取り出してOnMessage時にチェックするといった意味合いでしょうか??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問