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

时间:2015-04-01 10:14:44

标签: java sockets websocket jetty

我对websocket编程很新(或者更好:Web编程)。 前段时间我使用套接字和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)

非常感谢提前,感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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