diff --git a/src/main/java/com/example/cosmos_serversb/CosmosServerSbApplication.java b/src/main/java/com/example/cosmos_serversb/CosmosServerSbApplication.java index aaa3e30..8b0f80a 100644 --- a/src/main/java/com/example/cosmos_serversb/CosmosServerSbApplication.java +++ b/src/main/java/com/example/cosmos_serversb/CosmosServerSbApplication.java @@ -2,12 +2,15 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Configuration; + +import org.springframework.web.socket.config.annotation.EnableWebSocket; @SpringBootApplication +@Configuration +@EnableWebSocket public class CosmosServerSbApplication { - public static void main(String[] args) { SpringApplication.run(CosmosServerSbApplication.class, args); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/example/cosmos_serversb/JerseyConfig.java b/src/main/java/com/example/cosmos_serversb/JerseyConfig.java index 37ed2ee..ef60a1c 100644 --- a/src/main/java/com/example/cosmos_serversb/JerseyConfig.java +++ b/src/main/java/com/example/cosmos_serversb/JerseyConfig.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Component; @Component +@ApplicationPath("/rest") public class JerseyConfig extends ResourceConfig { public JerseyConfig() { packages("com.example.cosmos_serversb.resources"); diff --git a/src/main/java/com/example/cosmos_serversb/WebSocketConfig.java b/src/main/java/com/example/cosmos_serversb/WebSocketConfig.java new file mode 100644 index 0000000..896a270 --- /dev/null +++ b/src/main/java/com/example/cosmos_serversb/WebSocketConfig.java @@ -0,0 +1,35 @@ +package com.example.cosmos_serversb; + +import com.example.cosmos_serversb.resources.WebSocket; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.config.annotation.*; + + +@Configuration +@EnableWebSocket +@AllArgsConstructor +public class WebSocketConfig implements WebSocketConfigurer { + private final WebSocket websocket = new WebSocket(); + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry.addHandler(websocket, "/websocket"); + } + +} + +//@Configuration +//@EnableWebSocketMessageBroker +//public class WebSocketConfig implements WebSocketConfigurer { +// @Override +// public void registerStompEndpoints(StompEndpointRegistry registry) { +// registry.addEndpoint("/websocket") +// .setAllowedOrigins("/websocket").withSockJS(); +// } +// @Override +// public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { +// registry.addHandler(websocket, "/endpoint"); +// } +// +//} \ No newline at end of file diff --git a/src/main/java/com/example/cosmos_serversb/resources/WebSocket.java b/src/main/java/com/example/cosmos_serversb/resources/WebSocket.java new file mode 100644 index 0000000..1c9dbeb --- /dev/null +++ b/src/main/java/com/example/cosmos_serversb/resources/WebSocket.java @@ -0,0 +1,111 @@ +package com.example.cosmos_serversb.resources; + +import org.springframework.stereotype.Component; + +import javax.websocket.server.ServerEndpoint; +import java.util.HashSet; +import java.util.Set; + +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +@Component +@ServerEndpoint("/websocket") +public class WebSocket extends TextWebSocketHandler { + private static final Set sessions = new HashSet<>(); + //private ConcurrentHashMap> roomSessionPool = new ConcurrentHashMap<>(); + + public WebSocket(){ + + } + + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception { + sessions.add(session); + System.out.println("session確立しました"); +// String roomName = session.getUri().getQuery(); +// roomSessionPool.compute(roomName, (key, sessions) -> { +// if (sessions == null) { +// sessions = new CopyOnWriteArraySet<>(); +// } +// sessions.add(session); +// return sessions; +// }); + } + + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { + String strMessage = message.getPayload(); + System.out.println("message( " + strMessage + " )を受信しました"); + session.sendMessage(message); + for(WebSocketSession roomsSession : sessions){ + roomsSession.sendMessage(message); + } +// String roomName = session.getUri().getQuery(); +// for (WebSocketSession roomSession : roomSessionPool.get(roomName)) { +// roomSession.sendMessage(message); +// } + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { + sessions.remove(session); + System.out.println("session閉じました"); +// String roomName = session.getUri().getQuery(); +// roomSessionPool.compute(roomName, (key, sessions) -> { +// sessions.remove(session); +// if (sessions.isEmpty()) { +// // 1件もない場合はMapからクリア +// sessions = null; +// } +// return sessions; +// }); + } + + +// @GET +// public String serverCheck() { +// LogUtils.info("サーバーをチェックしています。"); +// return "{\"ServerStatus\":\"200\"}"; +// } +// @OnOpen +// public void onOpen(Session session) { +// /* セッション確立時の処理 */ +// sessions.add(session); +// System.out.println("WebSocketセッション確立"); +// } +// +// @OnMessage +// public String onMessage(String message) { +// /* メッセージ受信時の処理 */ +// System.out.println("WebSocket受信:" + message); +// return "正常にメッセージを受信しました。"; +// } +// +//// @OnMessage +//// public void onMessage(String message, Session session) throws IOException { +//// //session.getBasicRemote().sendText(message); //メッセージの送信が完了するまで待機 +//// session.getAsyncRemote().sendText(message); //非同期で送信 +//// } +// +// @OnError +// public void onError(Throwable th) { +// /* エラー発生時の処理 */ +// System.out.println("WebSocketエラー:" + th.getMessage()); +// } +// +// @OnClose +// public void onClose(Session session) { +// /* セッション解放時の処理 */ +// sessions.remove(session); +// System.out.println("WebSocketセッションを削除"); +// } +// +// public static void broadcast() { +// sessions.forEach(session -> { +// session.getAsyncRemote().sendText("Broadcast : "); +// }); +// } +} \ No newline at end of file diff --git a/src/test/java/WebSocketTest/SampleClient.java b/src/test/java/WebSocketTest/SampleClient.java new file mode 100644 index 0000000..49ce2cf --- /dev/null +++ b/src/test/java/WebSocketTest/SampleClient.java @@ -0,0 +1,110 @@ +package WebSocketTest; + +import java.net.URI; +import javax.websocket.ClientEndpoint; +import javax.websocket.ContainerProvider; +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.WebSocketContainer; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; +import okio.ByteString; + +public class SampleClient { + public static void main(String[] args) { + + WebSocket ws; + final Request request = new Request.Builder() +// .url("http://localhost:8080/WebSocketSampleServer") + .url("http://localhost:8080/websocket") + .build(); + final OkHttpClient client = new OkHttpClient.Builder() + .build(); + final WebSocketListener listener = new WebSocketListener() { + @Override + // 接続 + public void onOpen(WebSocket webSocket, Response response) { + } + + @Override + //Serverからのメッセージの受信 + public void onMessage(WebSocket webSocket, final String text) { + } + + @Override + public void onMessage(WebSocket webSocket, ByteString bytes) { + System.out.println("MESSAGE: " + bytes.hex()); + } + + @Override + public void onClosing(WebSocket webSocket, int code, String reason) { + webSocket.close(1000, null); + System.out.println("CLOSE: " + code + " " + reason); + } + + @Override + //Serverの切断 + public void onClosed(WebSocket webSocket, int code, String reason) { + } + + public void onFailure(WebSocket webSocket, Throwable t, Response response) { + t.printStackTrace(); + } + }; + + ws = client.newWebSocket(request, listener); + ws.send("Hello"); + client.dispatcher().executorService().shutdown(); + } +} + +//@ClientEndpoint +//public class SampleClient { +// +// public SampleClient() { +// super(); +// } +// +// @OnOpen +// public void onOpen(Session session) { +// /* セッション確立時の処理 */ +// System.out.println("WebSocketセッション確立"); +// } +// +// @OnMessage +// public void onMessage(String message) { +// /* メッセージ受信時の処理 */ +// System.out.println("WebSocket受信:"); +// } +// +// @OnError +// public void onError(Throwable th) { +// /* エラー発生時の処理 */ +// System.out.println("WebSocketエラー:" + th.getMessage()); +// } +// +// @OnClose +// public void onClose(Session session) { +// /* セッション解放時の処理 */ +// System.out.println("WebSocketセッション確立"); +// } +// +// +// public static void main(String[] args) throws Exception { +// // 初期化のためWebSocketコンテナのオブジェクトを取得する +// WebSocketContainer container = ContainerProvider.getWebSocketContainer(); +// // サーバー・エンドポイントのURI +// URI uri = URI.create("ws://localhost:8080/websocket"); +// // サーバー・エンドポイントとのセッションを確立する +// Session session = container.connectToServer(new SampleClient(),uri); +// // メッセージをサーバへ送る +// session.getBasicRemote().sendText("Hello World!!"); +// } +//} \ No newline at end of file