重点
1、JAVAでのWebSocketは、Java jar7.0後に使用することです。
2、パッケージアイテムのlibディレクトリのJavaServerでJavaEEの-API-7.0を導入する必要があります
|フロントエンドコード
|バックエンドのJavaコード
websocketProをパッケージ化。
輸入javax.websocket.OnClose;
輸入javax.websocket.OnMessage;
輸入javax.websocket.OnOpen;
輸入javax.websocket.Session。
輸入javax.websocket.server.PathParam;
輸入javax.websocket.server.ServerEndpoint;
輸入はjava.util.HashSet。
java.util.Set量;
輸入java.util.Map;
輸入java.util.concurrent.ConcurrentHashMap;
輸入java.util.concurrent.CopyOnWriteArraySet;
/ **
*脚本:holien時間:2017年8月1日夜1時00意図:WebSocketのサーバー
* /
@ServerEndpoint(「/のWebSocket /チャットルーム/ {roomName}」)//これはあなたの要求が名前roomNameのフロントエンドに送られるroomNameを生成するために、サーバルームへのパスです
パブリッククラスチャットルーム{
プライベート静的最終マップ>お部屋=新しいのConcurrentHashMap();
@OnOpen //セッションは、それを通してクライアントに接続セッションでクライアントに送信するオプションのパラメータ、セッション、データのニーズであります
公共のボイド接続(@PathParam( "roomName")文字列roomName、セッションセッションは){例外がスローされます
(もし!rooms.containsKey(roomName)){
セット部屋=新しいHashSetの<>();
room.add(セッション)。
rooms.put(roomName、部屋);
} そうしないと {
rooms.get(roomName)は(セッション).add。
}
System.out.println( "接続を確立します!");
}
@OnClose
公共のボイドDISCONNECT(@PathParam( "roomName")文字列roomName、セッションsession){
rooms.get(roomName).remove(セッション)。
System.out.println( "切断!");
}
@OnMessage
公共のボイドreceiveMsg(@PathParam( "roomName")文字列roomName、文字列のMSG、セッションセッションは){例外がスローされます
System.out.println(MSG)。
放送(roomName、MSG)。
}
//ルーム名に基づいて放送
公共の静的な無効放送(文字列roomName、文字列msgが){例外がスローされます
用(セッションセッション:rooms.get(roomName)){
session.getAsyncRemote()sendText(MSG)。
}
}
}
| JAVAサーバーのディレクトリ構造
ヒント:以下の各機能とそのメソッドの意味と関連性の簡単な説明です。
すべてのWebSocketのアイテムとの双方向通信を確立し、要求の後端のフロントエンドに送信されるように、手の成功を振った後、携帯電話との理由で通信できる必要があります。
WebSocketを=新しいのWebSocket(URL);
上記フロントエンドJSのWebSocketオブジェクトが作成され、バックエンド(サーバーのURLアドレス)あなたが呼んでいる人への通信要求に送信され、彼は電話に応答するのを待っていますさ
@ServerEndpoint( "/用WebSocket /チャットルーム/ {roomName}")
VaRのURL = "WS://172.16.245.232:8080 / WebsocketPro /のWebSocket / mainBlock /" + roomName。
バックエンドのJavaのアドレスをマークこのコメントは、サーバアクセスアドレスを要求し、現在のJavaファイルのフロントエンドには一貫性があります。
フロントエンドで定義さRoomName名{roomName}の後端に読み出されます
先に定義した通りroomName遠位MainBlock
だから、バックアノテートになるにアクセスパスを要求した後、
/のWebSocket /チャットルーム/ MainBlock
プライベート静的最終マップ>お部屋=新しいのConcurrentHashMap();
@OnOpen
公共のボイド接続(@PathParam( "roomName")文字列roomName、セッションセッションは){例外がスローされます
(もし!rooms.containsKey(roomName)){
セット部屋=新しいHashSetの<>(); //は、物理学と化学のハッシュオブジェクトの配列を作成します
room.add(セッション); //オブジェクトのハッシュでユーザオブジェクトに追加されたセッション・オブジェクト
rooms.put(roomName、部屋); //ハッシュオブジェクトとここで設定を取得するユーザからなる部屋のユーザ名を追加
} そうしないと {
//対応する部屋を設定するユーザーを取得します。rooms.get(roomName)は、(セッション).add
} 鄭州良い婦人科病院http://www.kd0371.com/
System.out.println( "接続を確立します!");
}
ConcurrentHashMapの参照についてのConcurrentHashMap
@OnOpenコメントの方法のこの時点でアプリケーションの後端部は、受信された後
今回は、基礎となるのWebSocketハンドシェイク契約となり、私たちは目の前を見ることができません
雪の通常のアクセスとハンドシェイクが成功すると、サーバーは自動的にこの接続方法を呼び出します。
このとき、契約の根本的な成功は、サーバーの握手に送信されます
そして、次のような方法も規定され、フロントエンドと呼ばれています
webSocket.onopen =関数(){
console.log(「ハンドシェイクおよびサーバーへの接続を確立...(握手)」)
}。
この時点まで前端と後端には、永続的な通信プロトコルの理論、パーティーの切断の1つだけでなくを確立します。あなたの成功と、彼は携帯電話を開きました
| Exchangeが始まりました
webSocket.send(MSG)。
私たちは、フロントのWebSocketオブジェクトのsend()メソッド着信メッセージが背景に送信されると呼ばれます
一般的な、より良いJSONでサーバに送信するデータをカプセル化します
@OnMessage
公共のボイドreceiveMsg(@PathParam( "roomName")文字列roomName、文字列のMSG、セッションセッションは){例外がスローされます
System.out.println(MSG)。
放送(roomName、MSG)。
}
着信メッセージは、背景マーキング方法を受信する@OnMessage
@PathParam( "roomName")文字列roomName
これが意味するマーク/用WebSocket /チャットルーム/ {roomName} roomName前の値であります
文字列MSG
このパラメータは、フロントデスクで送信されたメッセージです。このパラメータはコードで記述されたセッションのセッションは説明を繰り返しません
メッセージを受信すると、()関数内で完璧なカスタム・ブロードキャスト・メソッドと呼ばれた後、
公共の静的な無効放送(文字列roomName、文字列msgが){例外がスローされます
用(セッションセッション:rooms.get(roomName)){
session.getAsyncRemote()sendText(MSG)。
}
}
このメソッドはgetAsyncRemote()メソッド(MSG)のセッションオブジェクトと呼ばれるsendText
(部屋)のためのカプセル化の前に、すべてのオブジェクトにメッセージをブロードキャスト
webSocket.onmessage =関数(必要な場合){
VARデータ= JSON.parse(evt.data)
}。
フロントエンド用WebSocketオブジェクトメソッドと呼ばれるブロードキャストメッセージを受信した後のonMessage
ここではEVTのパラメータは、放送ニュースですが、バックエンドは、オブジェクト上を通過させます
JSONデータevt.dataオブジェクトが変換された場合私たちは、JSのオブジェクトを識別するためにそれを置くために、このメソッドを呼び出す必要があります
この時点までのメッセージの交換を完了します。
切断要求に、それは、この時間webSocket.close()メソッドを呼び出します
背景には、自動的に次のメソッドを呼び出します。
@OnClose
公共のボイドDISCONNECT(@PathParam( "roomName")文字列roomName、セッションsession){
System.out.println( "切断!");
}
フロントエンドに応じて、同時に、メソッド呼び出しを、次の
webSocket.onclose =関数(){
(「握手し、サーバへの接続がシャットダウンされました...(ブレイク)」)はconsole.log
WebSocketを= NULL;
}。
ここでは、完全な双方向の通信を終了する位置をWebSocketを。