Jetty:套接字连接作为 websocket 连接

Posted

技术标签:

【中文标题】Jetty:套接字连接作为 websocket 连接【英文标题】:Jetty: socket connection as websocket connection 【发布时间】:2015-04-01 10:14:44 【问题描述】:

我对 websocket 编程很陌生(或者更好:完全是 web 编程)。 前段时间我使用 Sockets 和 ServerSockets 在客户端和服务器之间交换数据,现在我开始使用 WebSockets 和 jetty 构建具有类似功能的东西,但直到现在才弄明白。

所以我现在的目标是:客户端收到一条字符串消息,使用 websocket 将其发送到服务器,而服务器只是粘贴该消息(到控制台或文件)。 一般上下文:我有 2 个应用程序在不同的机器上运行,并希望使用 websockets 在它们之间交换一些数据。

这是我客户的代码:

public class SocketClient 
    public static void main(String[] args) throws URISyntaxException 
        try 
            new SocketClient().run(new URI("ws://localhost:8080/"));
            //new SocketClient().run(new URI("wss://localhost:8443/"));
         catch (Exception e) 
            e.printStackTrace();
        

    
    public void run(URI destURI) throws Exception 
        WebSocketClient client = new WebSocketClient();
        try 
            client.start();
            ClientUpgradeRequest request = new ClientUpgradeRequest();

            ExampleSocket socket = new ExampleSocket();
            Future<Session> future = client.connect(socket,destURI,request);

            future.get();

            socket.getRemote().sendString("hello server"); 
        
        finally
        
            client.stop();
        
    



class ExampleSocket extends WebSocketAdapter

    @Override
    public void onWebSocketText(String message)
    
        try
        
            getRemote().sendString(message);
        
        catch (IOException e)
        
            e.printStackTrace();
        
    


这是我的服务器代码:

public class SocketServer extends AbstractHandler 
    public void handle(String target, Request baseRequest,HttpServletRequest request, HttpServletResponse response) 
        try 
            response.setContentType("text/html");
            response.setStatus(HttpServletResponse.SC_OK);
            baseRequest.setHandled(true);

            response.getWriter().println(request);
        
        catch (IOException ioe) 
            System.out.println(ioe);
        
    
    public static void main(String[] args) throws Exception 
        Server server = new Server(8080);
        server.setHandler(new SocketServer());

        server.start();
        server.join();
    

我主要从码头文件中得到这两个,但直到现在才弄明白。当我尝试将它们一起运行时,我的客户端上出现了该错误:

java.util.concurrent.ExecutionException: org.eclipse.jetty.websocket.api.UpgradeException: Didn't switch protocols
    at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:123)
    at SocketClient.run(SocketClient.java:37)
    at SocketClient.main(SocketClient.java:19)
Caused by: org.eclipse.jetty.websocket.api.UpgradeException: Didn't switch protocols
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.validateResponse(UpgradeConnection.java:278)
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.read(UpgradeConnection.java:205)
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.onFillable(UpgradeConnection.java:150)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Unknown Source)

非常感谢您,感谢任何帮助。

【问题讨论】:

【参考方案1】:

WebSocket 客户端需要 WebSocket 服务器。您在服务器中所做的是添加一个处理程序来仅处理 HTTP 请求-响应交换。您需要通过注册org.eclipse.jetty.websocket.servlet.WebSocketServlet 的servlet 或javax.websocket.Endpoint 的端点来允许Jetty 处理WebSocket 资源。

这是由 Jetty 团队编写的 working examples。如果您不是 JSR 的粉丝,请查看 native-jetty-websocket-example。

无论如何,如果这个答案不完整,Jetty团队会给你肯定的答案,因为他们正在看码头标签。

【讨论】:

感谢您提出我遗漏了什么的建议。尝试使用端点来解决它,这让我更接近解决方案。目前我们试图以不同的方式解决整个问题,因此它被认为已解决。非常感谢! 确实,您需要一个用于客户端的 websocket 和一个用于服务器端点的 websocket。我也遇到过同样的问题,但是当我从下面的4.6开始按照这个例子时,我一切都清楚了:examples.javacodegeeks.com/enterprise-java/jetty/…谁有这个问题,试着仔细看那个链接,它会有意义。【参考方案2】:

服务器可能以安全连接模式启动并尝试使用非安全 URL 进行连接,反之亦然。这可能是此异常的根本原因。

【讨论】:

以上是关于Jetty:套接字连接作为 websocket 连接的主要内容,如果未能解决你的问题,请参考以下文章

Jetty 如何创建自定义 WebSocket

让 Jetty Websocket 使用与 JavaScript Websocket 相同的语言

使用 WebSocket 连接到标准套接字

Linux Bash:如何作为客户端打开 websocket 连接

jetty 9,websockets 和关闭服务器端的 websocket 连接

抑制“与 'xyz' 的 WebSocket 连接失败”