通过Web套接字进行应用程序到应用程序的通信

时间:2021-09-06 04:59:58

I have some trouble getting application-to-application communication via web sockets (that is without a browser to work). Since this does not seem to be the most usual application of web sockets, I wonder if anybody has any experience doing this.

我通过Web套接字(没有浏览器工作)获得应用程序到应用程序的通信有些麻烦。由于这似乎不是最常用的网络套接字应用程序,我想知道是否有人有这方面的经验。

Why do I want to use web sockets?

为什么我要使用网络套接字?

Because of firewall issues I need to go through port 80/8080 (and I need to continue to handle some other HTTP communication, so I can't just use plain TCP/IP socket communication).

由于防火墙问题,我需要通过端口80/8080(我需要继续处理其他一些HTTP通信,所以我不能只使用普通的TCP / IP套接字通信)。

How did I try to make this work?

我是如何尝试这项工作的?

I'm using Jetty 8.0 both for the server and for the client. My server code:

我正在为服务器和客户端使用Jetty 8.0。我的服务器代码:

public class WebSocketTestServlet extends WebSocketServlet {

    public WebSocket doWebSocketConnect(HttpServletRequest arg0, String arg1) {
        return new TestWebSocket();
    }

    class TestWebSocket implements WebSocket, WebSocket.OnTextMessage
    {
         public void onClose(int arg0, String arg1) {   
         }

         public void onOpen(Connection arg0) {
         }

         public void onMessage(String messageText) {
         }

    }
}

My client code:

我的客户代码:

public class MyWebSocketClient{

    MyWebSocketClient() throws IOException
    {       
        WebSocketClientFactory factory = new WebSocketClientFactory();
        try {
            factory.start();
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        WebSocketClient client = factory.newWebSocketClient();

        WebSocket.Connection connection = client.open(new URI("ws://myserver:8080/testws"), new WebSocket.OnTextMessage()
        {
             public void onOpen(Connection connection)
             {
             } 

             public void onClose(int closeCode, String message)
             {
             }

             public void onMessage(String data)
             {
             }
        }).get(50, TimeUnit.SECONDS)

     }

What problem do I see?

我看到了什么问题?

A ProtocolException

Caused by: java.net.ProtocolException: Bad response status 302 Found
    at org.eclipse.jetty.websocket.WebSocketClientFactory$HandshakeConnection.closed(WebSocketClientFactory.java:423)
    at org.eclipse.jetty.websocket.WebSocketClientFactory$WebSocketClientSelector.endPointClosed(WebSocketClientFactory.java:235)
    at org.eclipse.jetty.io.nio.SelectorManager$SelectSet.destroyEndPoint(SelectorManager.java:948)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.doUpdateKey(SelectChannelEndPoint.java:523)
    at org.eclipse.jetty.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:469)
    at org.eclipse.jetty.io.nio.SelectorManager$1.run(SelectorManager.java:283)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
    at java.lang.Thread.run(Thread.java:619)

Any idea why this is not working?

知道为什么这不起作用吗?

2 个解决方案

#1


3  

Try to add "/" at the end of your address in the client's code:

尝试在客户端代码中的地址末尾添加“/”:

"ws://myserver:8080/testws/"

It just fixed the issue for me.

它只是为我解决了这个问题。

#2


0  

Trying to do something similar to allow WS calls to an embedded Jetty REST API...here's my echo test code (Jetty 7), HTH

尝试做类似的事情以允许WS调用嵌入式Jetty REST API ...这是我的echo测试代码(Jetty 7),HTH


public class myApiSocketServlet extends WebSocketServlet
{    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException ,IOException 
    {
        OutputStream responseBody = response.getOutputStream();
        responseBody.write("Socket API".getBytes());
        responseBody.close();
    }

    public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
    {
        return new APIWebSocket();
    }

    class APIWebSocket implements WebSocket, WebSocket.OnTextMessage
    {

        Connection connection; 

        @Override
        public void onClose(int arg0, String arg1)
        {

        }

        @Override
        public void onOpen(Connection c)
        {
            connection = c;     
        }

        @Override
        public void onMessage(String msg)
        {
            try
            {
                this.connection.sendMessage("I received: " + msg);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

        }
    }
}

#1


3  

Try to add "/" at the end of your address in the client's code:

尝试在客户端代码中的地址末尾添加“/”:

"ws://myserver:8080/testws/"

It just fixed the issue for me.

它只是为我解决了这个问题。

#2


0  

Trying to do something similar to allow WS calls to an embedded Jetty REST API...here's my echo test code (Jetty 7), HTH

尝试做类似的事情以允许WS调用嵌入式Jetty REST API ...这是我的echo测试代码(Jetty 7),HTH


public class myApiSocketServlet extends WebSocketServlet
{    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException ,IOException 
    {
        OutputStream responseBody = response.getOutputStream();
        responseBody.write("Socket API".getBytes());
        responseBody.close();
    }

    public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
    {
        return new APIWebSocket();
    }

    class APIWebSocket implements WebSocket, WebSocket.OnTextMessage
    {

        Connection connection; 

        @Override
        public void onClose(int arg0, String arg1)
        {

        }

        @Override
        public void onOpen(Connection c)
        {
            connection = c;     
        }

        @Override
        public void onMessage(String msg)
        {
            try
            {
                this.connection.sendMessage("I received: " + msg);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

        }
    }
}