簡體   English   中英

Jetty:socket 連接作為 websocket 連接

[英]Jetty: socket connection as websocket connection

我對 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)

所以在此先非常感謝,任何幫助表示贊賞。

WebSocket 客戶端需要 WebSocket 服務器。 您在服務器中所做的是添加一個處理程序來僅處理 HTTP 請求-響應交換。 您需要通過注冊org.eclipse.jetty.websocket.servlet.WebSocketServlet的 servlet 或javax.websocket.Endpoint的端點來允許 Jetty 處理 WebSocket 資源。

這是 Jetty 團隊編寫的工作示例 如果您不喜歡 JSR,請查看 native-jetty-websocket-example。

無論如何,如果此答案不完整,Jetty 團隊將給您明確的答案,因為他們正在觀看 jetty 標簽。

可能有服務器以安全連接模式啟動並嘗試使用非安全 URL 連接,反之亦然。 這可能是此異常的根本原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM