2014-10-19 6 views
61

Может кто-нибудь, пожалуйста, предоставит мне очень простой пример клиента websocket, используя javax.websocket?javax.websocket клиент простой пример

Я хочу подключиться к websocket (ws: //socket.example.com: 1234), отправить сообщение (добавить канал) и прослушать сообщения. Все сообщения (отправленные & прослушанные) находятся в формате JSON.

И btw является ли эта библиотека лучшей для простой связи в сети?

(извините за тупой вопрос, я учусь Java, спасибо)

ответ

79

Я нашел отличный пример использования 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); 
    } 
} 
+2

С бесплатной реализацией okcoin, спасибо :) – Thomas

+0

Привет, как заставить этот код работать, если websocketServer отправляет непрерывный поток сообщений, а websocketClient должен потреблять сообщения один за другим? Я получаю сообщение об ошибке «Расшифрованное текстовое сообщение было слишком большим для выходного буфера, а конечная точка не поддерживает частичные сообщения» после запуска кода в течение примерно минуты – firstpostcommenter

3

https://blog.idrsolutions.com/2013/12/websockets-an-introduction/ это простой пример, то будет есть клиент, который отправит сообщение на сервер и сервер отправит его обратно

несколько больше: https://www.youtube.com/watch?v=BikL52HYaZg http://www.hascode.com/2013/08/creating-a-chat-application-using-java-ee-7-websockets-and-glassfish-4/

с клиентом 'Java' как OP спросил Websocket and Java Swing front end

+1

Во всех примерах клиентские стороны писали в JavaScript, а не Java. Я ошибаюсь? – Martin

+0

Мне очень жаль, что я пропустил эту часть «Java».Я найду пример с клиентом Java. Но могу ли я спросить, в чем смысл, почему вы хотите реализовать java-клиент, когда совместимые браузеры (или фреймворк javascript работает, как socket.io)? – KingJulien

+0

Здесь вы идете приятель http://stackoverflow.com/questions/1982530/websocket-and-java-swing-front-end – KingJulien

31

TooTallNate имеет простой стороне клиента https://github.com/TooTallNate/Java-WebSocket

Просто добавьте java_websocket.jar в DIST папку в вашем проекте.

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(); 
+0

Работало ли оно в Windows 8.1? или только для Linux? – YumYumYum

+3

Работала в Windows 7, Windows 8 и OS X горном льве, используя eclipse, сервер был Ubuntu. – TCassells

+1

Почему вы выбрали эту библиотеку вместо javax? – Lichtamberg

15

Посмотрите на этой Java EE 7 примеров из Arun Гупта.

Я разветвил его on 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(); 
    } 
} 
Смежные вопросы