javax.websocket 클라이언트 간단한 예제


104

누군가가 사용하는 웹 소켓 클라이언트의 매우 간단한 예를 제공해주십시오. javax.websocket 시겠습니까?

websocket (ws : //socket.example.com : 1234)에 연결하여 메시지를 보내고 (채널 추가) 메시지를 듣고 싶습니다. 모든 메시지 (전송 및 수신)는 JSON 형식입니다.

그리고 btw는이 라이브러리가 간단한 웹 소켓 통신에 가장 적합합니까?

답변:


120

javax.websocket여기에서 사용하는 좋은 예를 찾았 습니다.

http://www.programmingforliving.com/2013/08/jsr-356-java-api-for-websocket-client-api.html

다음은 위에 링크 된 예제를 기반으로 한 코드입니다.

TestApp.java:

package testapp;

import java.net.URI;
import java.net.URISyntaxException;

public class TestApp {

    public static void main(String[] args) {
        try {
            // open websocket
            final WebsocketClientEndpoint clientEndPoint = new WebsocketClientEndpoint(new URI("wss://real.okcoin.cn:10440/websocket/okcoinapi"));

            // add listener
            clientEndPoint.addMessageHandler(new WebsocketClientEndpoint.MessageHandler() {
                public void handleMessage(String message) {
                    System.out.println(message);
                }
            });

            // send message to websocket
            clientEndPoint.sendMessage("{'event':'addChannel','channel':'ok_btccny_ticker'}");

            // wait 5 seconds for messages from websocket
            Thread.sleep(5000);

        } catch (InterruptedException ex) {
            System.err.println("InterruptedException exception: " + ex.getMessage());
        } catch (URISyntaxException ex) {
            System.err.println("URISyntaxException exception: " + ex.getMessage());
        }
    }
}

WebsocketClientEndpoint.java:

package testapp;

import java.net.URI;
import javax.websocket.ClientEndpoint;
import javax.websocket.CloseReason;
import javax.websocket.ContainerProvider;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;

/**
 * ChatServer Client
 *
 * @author Jiji_Sasidharan
 */
@ClientEndpoint
public class WebsocketClientEndpoint {

    Session userSession = null;
    private MessageHandler messageHandler;

    public WebsocketClientEndpoint(URI endpointURI) {
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            container.connectToServer(this, endpointURI);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Callback hook for Connection open events.
     *
     * @param userSession the userSession which is opened.
     */
    @OnOpen
    public void onOpen(Session userSession) {
        System.out.println("opening websocket");
        this.userSession = userSession;
    }

    /**
     * Callback hook for Connection close events.
     *
     * @param userSession the userSession which is getting closed.
     * @param reason the reason for connection close
     */
    @OnClose
    public void onClose(Session userSession, CloseReason reason) {
        System.out.println("closing websocket");
        this.userSession = null;
    }

    /**
     * Callback hook for Message Events. This method will be invoked when a client send a message.
     *
     * @param message The text message
     */
    @OnMessage
    public void onMessage(String message) {
        if (this.messageHandler != null) {
            this.messageHandler.handleMessage(message);
        }
    }

    /**
     * register message handler
     *
     * @param msgHandler
     */
    public void addMessageHandler(MessageHandler msgHandler) {
        this.messageHandler = msgHandler;
    }

    /**
     * Send a message.
     *
     * @param message
     */
    public void sendMessage(String message) {
        this.userSession.getAsyncRemote().sendText(message);
    }

    /**
     * Message handler.
     *
     * @author Jiji_Sasidharan
     */
    public static interface MessageHandler {

        public void handleMessage(String message);
    }
}

1
안녕하세요, websocketServer가 연속적인 메시지 스트림을 보내고 websocketClient가 메시지를 하나씩 소비해야하는 경우이 코드를 작동시키는 방법은 무엇입니까? 나는 "디코딩 된 문자 메시지가 출력 버퍼에 대한 너무 커서 및 엔드 포인트가 부분적인 메시지를 지원하지 않습니다"분 정도의 코드를 실행 한 후 오류
firstpostcommenter

maven-import org.java-websocket을 확인하십시오.
Albert Hendriks

9
이 코드는 다음 오류와 함께 실패합니다. 구현 클래스를 찾을 수 없습니다.
Kirk Sefchik

2
@deathgaze javax.websocket api는 완전한 구현이없는 사양 일뿐입니다. jar 파일 tyrus-standalone-client-1.9.jar를 가져 와서 문제를 해결해야하는 동일한 예제를 시도해야 할 수도 있습니다. 내 예제로 테스트했는데 잘 작동합니다. 이것이 당신을 도울 수 있기를 바랍니다.
SRK

@Martin Open에서 메시지를 보내려면 어떻게해야합니까? 예 : 구독하려면 웹 소켓을 열 때 '{ "type": "subscribe", "symbol": "AAPL"}'을 보내야합니다.
Buddhika

40

TooTallNate에는 간단한 클라이언트 측 https://github.com/TooTallNate/Java-WebSocket이 있습니다.

dist 폴더의 java_websocket.jar을 프로젝트에 추가하기 만하면됩니다.

 import org.java_websocket.client.WebSocketClient;
 import org.java_websocket.drafts.Draft_10;
 import org.java_websocket.handshake.ServerHandshake;
 import org.json.JSONException;
 import org.json.JSONObject;

  WebSocketClient mWs = new WebSocketClient( new URI( "ws://socket.example.com:1234" ), new Draft_10() )
{
                    @Override
                    public void onMessage( String message ) {
                     JSONObject obj = new JSONObject(message);
                     String channel = obj.getString("channel");
                    }

                    @Override
                    public void onOpen( ServerHandshake handshake ) {
                        System.out.println( "opened connection" );
                    }

                    @Override
                    public void onClose( int code, String reason, boolean remote ) {
                        System.out.println( "closed connection" );
                    }

                    @Override
                    public void onError( Exception ex ) {
                        ex.printStackTrace();
                    }

                };
 //open websocket
 mWs.connect();
 JSONObject obj = new JSONObject();
 obj.put("event", "addChannel");
 obj.put("channel", "ok_btccny_ticker");
 String message = obj.toString();
 //send message
 mWs.send(message);

// 그리고 websocket을 닫습니다.

 mWs.close();

4
이클립스를 사용하여 Windows 7, Windows 8 및 OS X Mountain Lion에서 작업 한 서버는 Ubuntu였습니다.
TCassells

1
javax 대신이 라이브러리를 선택하는 이유는 무엇입니까?
BvuRVKyUVlViVIc7

2
그것은 분명 간단 원인
카일 누가 복음

4
wss 프로토콜 (보안 ws)을 지원하려면 어떤 변경이 필요합니까?
Mihailo Stupar

2
훌륭한 라이브러리이지만 wss에 문제가 있습니다. 이 프로젝트에는 몇 가지 미해결 문제가 있으며 개발자는 더 이상 시간이 없다고 말합니다.
SiKing

18

Arun Gupta의이 Java EE 7 예제를 살펴보십시오.

나는 그것을 github에서 포크했다 .

본관

/**
 * @author Arun Gupta
 */
public class Client {

    final static CountDownLatch messageLatch = new CountDownLatch(1);

    public static void main(String[] args) {
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            String uri = "ws://echo.websocket.org:80/";
            System.out.println("Connecting to " + uri);
            container.connectToServer(MyClientEndpoint.class, URI.create(uri));
            messageLatch.await(100, TimeUnit.SECONDS);
        } catch (DeploymentException | InterruptedException | IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

ClientEndpoint

/**
 * @author Arun Gupta
 */
@ClientEndpoint
public class MyClientEndpoint {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("Connected to endpoint: " + session.getBasicRemote());
        try {
            String name = "Duke";
            System.out.println("Sending message to endpoint: " + name);
            session.getBasicRemote().sendText(name);
        } catch (IOException ex) {
            Logger.getLogger(MyClientEndpoint.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @OnMessage
    public void processMessage(String message) {
        System.out.println("Received message in client: " + message);
        Client.messageLatch.countDown();
    }

    @OnError
    public void processError(Throwable t) {
        t.printStackTrace();
    }
}

당신은이 웹 소켓 의존성이 별도로 제공이 필요하다는 언급해야한다
자바 주


1

이 라이브러리 org.java_websocket 사용

먼저 build.gradle에서 해당 라이브러리를 가져와야합니다.

repositories {
 mavenCentral()
 }

그런 다음 종속성에 구현 추가 {}

implementation "org.java-websocket:Java-WebSocket:1.3.0"

그런 다음이 코드를 사용할 수 있습니다.

활동에서 Websocketclient에 대한 객체를 다음과 같이 선언하십시오.

private WebSocketClient mWebSocketClient;

그런 다음 콜백 에이 메서드를 추가하십시오.

 private void ConnectToWebSocket() {
URI uri;
try {
    uri = new URI("ws://your web socket url");
} catch (URISyntaxException e) {
    e.printStackTrace();
    return;
}

mWebSocketClient = new WebSocketClient(uri) {
    @Override
    public void onOpen(ServerHandshake serverHandshake) {
        Log.i("Websocket", "Opened");
        mWebSocketClient.send("Hello from " + Build.MANUFACTURER + " " + Build.MODEL);
    }

    @Override
    public void onMessage(String s) {
        final String message = s;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                TextView textView = (TextView)findViewById(R.id.edittext_chatbox);
                textView.setText(textView.getText() + "\n" + message);
            }
        });
    }

    @Override
    public void onClose(int i, String s, boolean b) {
        Log.i("Websocket", "Closed " + s);
    }

    @Override
    public void onError(Exception e) {
        Log.i("Websocket", "Error " + e.getMessage());
    }
};
mWebSocketClient.connect();

}


-2

내 프로젝트에 Spring 4.2가 있고 많은 SockJS Stomp 구현이 일반적으로 Spring Boot 구현과 잘 작동합니다. Baeldung의이 구현은 작동 했습니다 (Spring 4.2에서 5로 변경하지 않고 나를 위해). 그의 블로그에 언급 된 종속성을 사용한 후에도 여전히 ClassNotFoundError가 발생했습니다. 수정하기 위해 아래 종속성을 추가했습니다.

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.