Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
25
Help us understand the problem. What is going on with this article?
@oyahiroki

WebSocket を Java で。(サーバーもクライアントもJava)

サンプルコードがきれいにまとまったページが無かったので作りました。

参考にしたページ

WebSocket Server (Java)

「WebSphere Application Server Liberty Core」で新たに正式サポートされたWebSocketを使ってみた (1/6):CodeZine(コードジン)
https://codezine.jp/article/detail/8418

WebSocket Client (Java)

WebSocket のクライアントを作ってみた (Java で) (クレスコエンジニアブログ)
http://service.cresco.co.jp/blog/entry/184

サーバー側

HelloEndPoint.java
package pkg;

import java.io.IOException;
import java.util.Set;

import javax.websocket.CloseReason;
import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

/**
 * Websocket Endpoint implementation class HelloEndPoint
 */

@ServerEndpoint("/helloendpoint")
public class HelloEndPoint {

    // 現在のセッションを記録
    Session currentSession = null;

    public HelloEndPoint() {
        super();
    }

    /*
     * 接続がオープンしたとき
     */
    @OnOpen
    public void onOpen(Session session, EndpointConfig ec) {
        this.currentSession = session;
    }

    /*
     * メッセージを受信したとき
     */
    @OnMessage
    public void receiveMessage(String msg) throws IOException {
        // メッセージをクライアントに送信する
        this.currentSession.getBasicRemote().sendText("Hello " + msg + ".");

        Set<Session> sessions = currentSession.getOpenSessions();
        for (Session session : sessions) {
            try {
                session.getBasicRemote().sendText("Hello " + msg + ".(2)");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
     * 接続がクローズしたとき
     */
    @OnClose
    public void onClose(Session session, CloseReason reason) {
        // ...
    }

    /*
     * 接続エラーが発生したとき
     */
    @OnError
    public void onError(Throwable t) {
        // ...
    }

}

クライアント側

WebSocketClientMain
package pkg;

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;

/**
 * Websocket Endpoint implementation class WebSocketClientMain
 */

@ClientEndpoint
public class WebSocketClientMain {

    public WebSocketClientMain() {
        super();
    }

    @OnOpen
    public void onOpen(Session session) {
        /* セッション確立時の処理 */
        System.err.println("[セッション確立]");
    }

    @OnMessage
    public void onMessage(String message) {
        /* メッセージ受信時の処理 */
        System.err.println("[受信]:" + message);
    }

    @OnError
    public void onError(Throwable th) {
        /* エラー発生時の処理 */
    }

    @OnClose
    public void onClose(Session session) {
        /* セッション解放時の処理 */
    }

    static public void main(String[] args) throws Exception {

        // 初期化のため WebSocket コンテナのオブジェクトを取得する
        WebSocketContainer container = ContainerProvider
                .getWebSocketContainer();
        // サーバー・エンドポイントの URI
        URI uri = URI
                .create("ws://localhost:9080/hellowebsocket/helloendpoint");
        // サーバー・エンドポイントとのセッションを確立する
        Session session = container.connectToServer(new WebSocketClientMain(),
                uri);

        session.getBasicRemote().sendText("こんにちは");

        while (session.isOpen()) {
            Thread.sleep(100 * 1000);
            System.err.println("open");
        }

    }

}

maven

<!-- https://mvnrepository.com/artifact/javax.websocket/javax.websocket-api -->
<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.1</version>
    <scope>provided</scope>
</dependency>
25
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
oyahiroki
Hiroki Oya <oyahiroki> 自然言語処理技術者 NLP Engineer (2001-2018) IBMで自然言語処理ソリューションの開発 (IBM Watson) (2018-現在) 日産自動車で自然言語処理ソリューションの開発 --- #NLP4J #自然言語処理

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
25
Help us understand the problem. What is going on with this article?