没有浏览器的Java Websocket客户端

Epi*_*avi 9 java html5 client websocket

我正在开发一个需要用户之间进行实时交互的项目.我希望有一个HTML5 Web客户端(足够简单)和一个本地客户端(最好是Java),它们都可以连接到服务器.我做了一些研究,并没有找到一个结论性的答案,本地客户端是否可以在没有浏览器的情况下连接到服务器.

问题:有没有办法在没有浏览的情况下从本地Java客户端连接到websocket服务器?我已经看到其他语言中的一些浏览器包装器可能使这成为可能.如果没有,我愿意接受建议.

谢谢.

小智 8

您当然可以在浏览器沙箱之外使用Java中桌面应用程序的WebSockets.这背后的想法是您可以创建创建TCP连接的胖客户端,因此他们当然应该能够在这些TCP连接之上创建WebSocket连接.

这样做的最新和最好的API之一是由Kaazing编写的,它认为WebSocket就像一个套接字,可以使用简单的"ws://"URI创建.

在Kaazing Gateway 5.0 Java WebSocket文档站点上详细讨论了API .您可以在这里从Kaazing下载普通网关

创建一个websocket:

    import com.kaazing.net.ws.WebSocket;
    import com.kaazing.net.ws.WebSocketFactory;

    wsFactory = WebSocketFactory.createWebSocketFactory();
    ws = wsFactory.createWebSocket(URI.create("ws://example.com:8001/path"));
    ws.connect(); // This will block or throw an exception if failed.
Run Code Online (Sandbox Code Playgroud)

要发送消息,请添加WebSocketMessageWriter对象:

    WebSocketMessageWriter writer = ws.getMessageWriter();
    String text = "Hello WebSocket!";
    writer.writeText(text);   // Send text message
Run Code Online (Sandbox Code Playgroud)

要接收或使用消息,请添加WebSocket和WebSocketMessageReader对象:

    wsFactory = WebSocketFactory.createWebSocketFactory();
    ws = wsFactory.createWebSocket(URI.create("ws://example.com:8001/path"));
    ws.connect(); // This will block or throw an exception if failed.

    WebSocketMessageReader reader = ws.getMessageReader();
    WebSocketMessageType type = null; // Block till a message arrives
      // Loop till the connection goes away
      while ((type =  reader.next()) != WebSocketMessageType.EOS) {
        switch (type) { // Handle both text and binary messages
          case TEXT:
            CharSequence text = reader.getText();
            log("RECEIVED TEXT MESSAGE: " + text.toString());
            break;
          case BINARY:
            ByteBuffer buffer = reader.getBinary();
            log("RECEIVED BINARY MESSAGE: " + getHexDump(buffer));
            break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

(完全披露:我曾在Kaazing Corporation担任服务器工程师.)


Pav*_*cek 7

您还可以考虑使用JSR 356 - Java API for WebSocket.它是Java EE 7的一部分,但客户端可以从普通的Java SE运行而不会出现任何问题.现在有多种实现可用,所有这些实现都可以使用:

程序化API:

    final WebSocketContainer webSocketContainer = ContainerProvider.getWebSocketContainer();

    Session session = webSocketContainer.connectToServer(new Endpoint() {
        @Override
        public void onOpen(Session session, EndpointConfig config) {
            // session.addMessageHandler( ... );
        }
    }, URI.create("ws://some.uri"));
Run Code Online (Sandbox Code Playgroud)

带注释的API:

public static void main(String[] args) throws IOException, DeploymentException {
    final WebSocketContainer webSocketContainer = ContainerProvider.getWebSocketContainer();
    webSocketContainer.connectToServer(MyEndpoint.class, URI.create("ws://some.uri"));
}

@ClientEndpoint
public static class MyEndpoint {

    // text
    @OnMessage
    void onMessage(Session session, String message) {
        // ...
    }

    // binary
    @OnMessage
    void onMessage(Session session, ByteBuffer message) {
        // ...
    }

    // @OnClose, @OnOpen, @OnError
}
Run Code Online (Sandbox Code Playgroud)

请参阅链接页面了解更多详情(完整规格).

这里有各种实现,基本上每个Java容器都有一个.我正在开发Glassfish/WebLogic实现,它叫做Tyrus,可以随意尝试(我们提供易于使用的所有功能,请参见http://search.maven.org/...).