Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用java实现WebSocket服务器?_Java_Websocket_Server - Fatal编程技术网

如何用java实现WebSocket服务器?

如何用java实现WebSocket服务器?,java,websocket,server,Java,Websocket,Server,我正在为一个通信应用程序设置我的第一个websocket服务器。我似乎不明白WebSocket是如何在Java中实现的 我尝试过创建一个基于注释的端点,但没有成功,但我不确定客户端信息将从何而来。这基本上是我代码的要点,而不涉及平凡的细节 我试图让MessageHelper类处理websocket信息传输,我只是不知道如何在那里真正获得传输 class MainServer implements Runnable { // VARIABLES ServerSocket serverSoc

我正在为一个通信应用程序设置我的第一个websocket服务器。我似乎不明白WebSocket是如何在Java中实现的

我尝试过创建一个基于注释的端点,但没有成功,但我不确定客户端信息将从何而来。这基本上是我代码的要点,而不涉及平凡的细节

我试图让MessageHelper类处理websocket信息传输,我只是不知道如何在那里真正获得传输

class MainServer implements Runnable {
// VARIABLES
    ServerSocket serverSocket = null;
    int port;
// CONSTRUCTORS
    MainServer(int p) {
        this.port = p;
    }
// METHODS
    public void run() {
        openServerSocket();
        while(!isStopped()){
            try{
                clientSocket = serverSocket.accept();
            } catch(IOException e) {
                // Do something
            }
            new Thread(new MainThread(clientSocket)).start();
        }
    }
}

// Other methods below.
如果您愿意使用-我认为这对于您的用例来说是非常好的,那么设置websocket服务器和客户端连接非常容易


这里有一个例子-

请不要混淆WebSocket的名称。TCP套接字和WebSocket是完全不同的“套接字”

在Java中,TCP套接字使用一个。TCP是一种传输层协议,用于实现应用层协议,如POP3和HTTP

WebSocket是一种HTTP/1.1协议升级,常用于web服务器和web浏览器。您不能将ServerSocket用于WebSocket协议,至少不像您想象的那样直接。首先,您必须实现HTTP/1.1协议,然后在此基础上实现WebSocket协议

在Java世界中,您可以使用Tomcat或Jetty等web服务器,它们提供WebSocket实现和。此API是Jave企业版(JEE)的一部分。另见

例如,Jetty是一种轻量级JEE web服务器,可以嵌入到您的应用程序中,也可以作为独立服务器运行。看

因此,在运行在支持WebSocket的JEE web服务器(如Jetty)中的Java web应用程序中,您可以实现服务器端WebSocket,如下所示:

package com.example.websocket;

import org.apache.log4j.Logger;

import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@ServerEndpoint("/toUpper")
public class ToUpperWebsocket {

  private static final Logger LOGGER = Logger.getLogger(ToUpperWebsocket.class);

  @OnOpen
  public void onOpen(Session session) {
    LOGGER.debug(String.format("WebSocket opened: %s", session.getId()));
  }

  @OnMessage
  public void onMessage(String txt, Session session) throws IOException {
    LOGGER.debug(String.format("Message received: %s", txt));
    session.getBasicRemote().sendText(txt.toUpperCase());
  }

  @OnClose
  public void onClose(CloseReason reason, Session session) {
    LOGGER.debug(String.format("Closing a WebSocket (%s) due to %s", session.getId(), reason.getReasonPhrase()));
  }

  @OnError
  public void onError(Session session, Throwable t) {
    LOGGER.error(String.format("Error in WebSocket session %s%n", session == null ? "null" : session.getId()), t);
  }
}
使用
@ServerEndpoint
注释将类注册为特定路径的WebSocket处理程序。然后,您的WebSocket URL是
ws://host:port/context/toUpper
wss://host:port/context/toUpper
用于HTTPS连接

编辑: 下面是一个非常简单的HTML页面,用于演示客户端与上述WebSocket的连接。此页面由与WebSocket相同的Web服务器提供服务。包含WebSocket的webapplication部署在本地主机端口7777上的上下文“WebSocket”处

    <html>
    <body>
    <h2>WebSocket Test</h2>
    <div>
    <input type="text" id="input" />
    </div>
    <div>
    <input type="button" id="connectBtn" value="CONNECT" onclick="connect()" />
    <input type="button" id="sendBtn" value="SEND" onclick="send()" disable="true" />
    </div>
    <div id="output">
    <h2>Output</h2>
    </div>
    </body>
    <script type="text/javascript">
    var webSocket;
    var output = document.getElementById("output");
    var connectBtn = document.getElementById("connectBtn");
    var sendBtn = document.getElementById("sendBtn");
    var wsUrl = (location.protocol == "https:" ? "wss://" : "ws://") + location.hostname + (location.port ? ':'+location.port: '') + "/websocket/toUpper";

    function connect() {
      // open the connection if one does not exist
      if (webSocket !== undefined
        && webSocket.readyState !== WebSocket.CLOSED) {
        return;
      }

      updateOutput("Trying to establish a WebSocket connection to <code>" + wsUrl + "</code>");

      // Create a websocket
      webSocket = new WebSocket(wsUrl);

      webSocket.onopen = function(event) {
        updateOutput("Connected!");
        connectBtn.disabled = true;
        sendBtn.disabled = false;
      };

      webSocket.onmessage = function(event) {
        updateOutput(event.data);
      };

      webSocket.onclose = function(event) {
        updateOutput("Connection Closed");
        connectBtn.disabled = false;
        sendBtn.disabled = true;
      };
    }

    function send() {
      var text = document.getElementById("input").value;
      webSocket.send(text);
    }

    function closeSocket() {
      webSocket.close();
    }

    function updateOutput(text) {
      output.innerHTML += "<br/>" + text;
    }
    </script>
    </html>

好的,所以我一直在阅读您发送的链接,我仍然不确定客户端如何访问ToUpperWebsocket类。@Kyler:我更新了我的答案,并包含了一些客户端代码。
    <html>
    <body>
    <h2>WebSocket Test</h2>
    <div>
    <input type="text" id="input" />
    </div>
    <div>
    <input type="button" id="connectBtn" value="CONNECT" onclick="connect()" />
    <input type="button" id="sendBtn" value="SEND" onclick="send()" disable="true" />
    </div>
    <div id="output">
    <h2>Output</h2>
    </div>
    </body>
    <script type="text/javascript">
    var webSocket;
    var output = document.getElementById("output");
    var connectBtn = document.getElementById("connectBtn");
    var sendBtn = document.getElementById("sendBtn");
    var wsUrl = (location.protocol == "https:" ? "wss://" : "ws://") + location.hostname + (location.port ? ':'+location.port: '') + "/websocket/toUpper";

    function connect() {
      // open the connection if one does not exist
      if (webSocket !== undefined
        && webSocket.readyState !== WebSocket.CLOSED) {
        return;
      }

      updateOutput("Trying to establish a WebSocket connection to <code>" + wsUrl + "</code>");

      // Create a websocket
      webSocket = new WebSocket(wsUrl);

      webSocket.onopen = function(event) {
        updateOutput("Connected!");
        connectBtn.disabled = true;
        sendBtn.disabled = false;
      };

      webSocket.onmessage = function(event) {
        updateOutput(event.data);
      };

      webSocket.onclose = function(event) {
        updateOutput("Connection Closed");
        connectBtn.disabled = false;
        sendBtn.disabled = true;
      };
    }

    function send() {
      var text = document.getElementById("input").value;
      webSocket.send(text);
    }

    function closeSocket() {
      webSocket.close();
    }

    function updateOutput(text) {
      output.innerHTML += "<br/>" + text;
    }
    </script>
    </html>