diff --git a/src/main/java/com/ntlab/irisserver/resources/HelloWorld.java b/src/main/java/com/ntlab/irisserver/resources/HelloWorld.java index 95c9472..05d4204 100644 --- a/src/main/java/com/ntlab/irisserver/resources/HelloWorld.java +++ b/src/main/java/com/ntlab/irisserver/resources/HelloWorld.java @@ -10,7 +10,7 @@ public class HelloWorld { @GET public String getHello() { - return "完成!?!?。12/20-15:10"; + return "12/21-10:50 WebSocketのコード追加"; } } diff --git a/src/main/java/com/ntlab/irisserver/websockets/GameStartWebSocket.java b/src/main/java/com/ntlab/irisserver/websockets/GameStartWebSocket.java index dd9fd03..afee617 100644 --- a/src/main/java/com/ntlab/irisserver/websockets/GameStartWebSocket.java +++ b/src/main/java/com/ntlab/irisserver/websockets/GameStartWebSocket.java @@ -10,9 +10,12 @@ import javax.websocket.*; import javax.websocket.server.ServerEndpoint; +import javax.websocket.server.PathParam; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Executors; @@ -20,7 +23,7 @@ import java.util.concurrent.TimeUnit; -@ServerEndpoint("/game-start") +@ServerEndpoint("/game-start/{rid}") public class GameStartWebSocket implements ApplicationContextAware { private ApplicationContext applicationContext; @@ -29,58 +32,99 @@ this.applicationContext = applicationContext; } - private static final Queue sessions = new ConcurrentLinkedQueue<>(); + private static Map sessionMap = new HashMap(); static { ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); } @OnMessage - public String onMessage(String message) throws IOException { - // rid,nickname,2 でメッセージが来るはず + public String onMessage(Session session, String message, @PathParam("rid") String rid) throws IOException { System.out.println("WebSocketで受信したメッセージ/ " + message); - String[] msgs = message.split(","); - String rid = msgs[0]; - String nickname = msgs[1]; - Integer state = Integer.parseInt(msgs[2]); - System.out.println(rid); - System.out.println(nickname); - System.out.println(state); - - RoomManager rm = RoomManager.getInstance(); - Room room = rm.getRoom(rid); - - if(nickname.equals(room.ownerName)){ //nicknameがownerだった場合 - room.setState(state); //部屋の情報を変更 - if (state == 2) { + // "nickname,state"がメッセージで渡される + String[] splitMessage = message.split(","); + String nickname = splitMessage[0]; + Integer state = Integer.parseInt(splitMessage[1]); + + // stateやnicknameが正常でなければ、何もしない + if(state!=2||nickname==null) { + session.getBasicRemote().sendText("nicknameかstateが空です、エラーエラー"); + } else { + //stateを変更して、全体の画面を変更させるように導く処理 + session.getBasicRemote().sendText(nickname+state+"が正常に渡された!"); + RoomManager rm = RoomManager.getInstance(); + Room room = rm.getRoom(rid); + if(nickname.equals(room.ownerName)){ //nicknameがownerだった場合 + room.setState(state); //部屋の情報を変更 String path; path = applicationContext.getResource("file:").getFile().getAbsolutePath()+"/apache-tomcat-9.0.10/webapps/irisdata/keywords.txt"; KeywordManager km = KeywordManager.getInstance(); String[] keywords = km.getKeywords(path); Game game = new Game(room, keywords); + + // 同じridのメンバーに一斉にメッセージ送って、画面を切り替えさせる + // 本来はここに処理を書くべきではないかも。 + for(Map.Entry entry : sessionMap.entrySet()) { + if(entry.getKey().contains(rid)){ + entry.getValue().getBasicRemote().sendText("changeState-2"); + } + } } } - - return "WebSocketでメッセージを正常に受信しました: " + message; + + return "WebSocketでメッセージを受信しました!"; } @OnError - public void onError(Throwable th) { + public void onError(Throwable th, @PathParam("rid") String rid) { System.out.println("WebSocketエラーが発生/ " + th.getMessage()); } @OnOpen - public void onOpen(Session session) { + public void onOpen(Session session, @PathParam("rid") String rid) throws IOException { System.out.println("WebSocketセッション確立"); - sessions.add(session); + + // ニックネームをクエリパラメータで受け取る処理 + // 値がなければ、websocketを切断する + String nickname = null; + String[] queries = session.getQueryString().split("&"); + for(String query: queries) { + if(query.contains("nickname=")){ + nickname = query.replace("nickname=", ""); + } + } + if(nickname==null) { + session.getBasicRemote().sendText("ニックネームのクエリが空だったので切断しました。"); + session.close(); + } + System.out.println(rid); + System.out.println(nickname); + + sessionMap.put(rid+","+nickname, session); + System.out.println(sessionMap.size()); + + // 同じridのメンバーにメッセージを送る + for(Map.Entry entry : sessionMap.entrySet()) { + if(entry.getKey().contains(rid)){ + entry.getValue().getBasicRemote().sendText("同じridに仲間が入ったよ。"+entry.getKey()); + System.out.println(entry.getKey()); + } + } } @OnClose - public void onClose(Session session) { + public void onClose(Session session, @PathParam("rid") String rid) { System.out.println("WebSocketセッション終了"); - sessions.remove(session); - } + String nickname = null; + String[] queries = session.getQueryString().split("&"); + for(String query: queries) { + if(query.contains("nickname=")){ + nickname = query.replace("nickname=", ""); + } + } + sessionMap.remove(rid+","+nickname); + } }