package com.ntlab.irisserver.websockets; import com.ntlab.irisserver.entities.Game; import com.ntlab.irisserver.entities.Room; import com.ntlab.irisserver.models.KeywordManager; import com.ntlab.irisserver.models.RoomManager; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; 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; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @ServerEndpoint("/game-start/{rid}") public class GameStartWebSocket implements ApplicationContextAware { private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } private static Map<String, Session> sessionMap = new HashMap(); static { ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); } @OnMessage public String onMessage(Session session, String message, @PathParam("rid") String rid) throws IOException { System.out.println("WebSocketで受信したメッセージ/ " + message); // "nickname,state"がメッセージで渡される String[] splitMessage = message.split(","); String nickname = splitMessage[0]; int 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); session.getBasicRemote().sendText(room.rid); session.getBasicRemote().sendText(room.getOwnerName()); session.getBasicRemote().sendText(room.ownerName); if(nickname.equals(room.ownerName)){ //nicknameがownerだった場合 room.setState(state); //部屋の情報を変更 String path; // 下の1行で失敗しておる。 path = applicationContext.getResource("file:").getFile().getAbsolutePath()+"/apache-tomcat-9.0.10/webapps/irisdata/keywords.txt"; session.getBasicRemote().sendText("3"); // ここいけてない KeywordManager km = KeywordManager.getInstance(); String[] keywords = km.getKeywords(path); Game game = new Game(room, keywords); // 同じridのメンバーに一斉にメッセージ送って、画面を切り替えさせる // 本来はここに処理を書くべきではないかも。 for(Map.Entry<String, Session> entry : sessionMap.entrySet()) { if(entry.getKey().contains(rid)){ entry.getValue().getBasicRemote().sendText("changeState-2"); } } } } return "WebSocketでメッセージを受信しました!"; } @OnError public void onError(Throwable th, @PathParam("rid") String rid) { System.out.println("WebSocketエラーが発生/ " + th.getMessage()); } @OnOpen public void onOpen(Session session, @PathParam("rid") String rid) throws IOException { System.out.println("WebSocketセッション確立"); // ニックネームをクエリパラメータで受け取る処理 // 値がなければ、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<String, Session> 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, @PathParam("rid") String rid) { System.out.println("WebSocketセッション終了"); String nickname = null; String[] queries = session.getQueryString().split("&"); for(String query: queries) { if(query.contains("nickname=")){ nickname = query.replace("nickname=", ""); } } sessionMap.remove(rid+","+nickname); } }