Как создать встроенный сервер WebSocket Jetty 9?
Я ненавижу задавать такой неопределенный вопрос, но мне сложно найти простой пример. Вот что я до сих пор:
public class JettyWebSocketServlet extends WebSocketServlet{
@Override
public void configure(WebSocketServletFactory factory) {
factory.register(MyEchoSocket.class);
}
}
@WebSocket
public class MyEchoSocket {
@OnWebSocketMessage
public void onText(WebSocketConnection conn, String message) {
System.out.println("text: " + message);
try {
conn.write(null, new FutureCallback(), "got: " + message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Вложенные примеры Jetty, которые я могу найти, всегда показывают что-то вроде следующего, чтобы запустить экземпляр сервера, но я не знаю, как создать экземпляр моего WebSocketServlet.
Server server = new Server(8080);
server.start();
server.join();
Как создать встроенный сервер, который может обрабатывать запросы на соединение с WebSocket?
Ответы
Ответ 1
Обновление: 2 декабря 2013 г.
В обновленном примере Embedded Jetty с WebSocket см.:
https://github.com/jetty-project/embedded-jetty-websocket-examples
Оригинальный ответ
Вот пример, найденный в тестовых случаях.
http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/examples/echo/ExampleEchoServer.java
Короткий ответ:
Server server = new Server(8080);
WebSocketHandler wsHandler = new WebSocketHandler()
{
@Override
public void configure(WebSocketServletFactory factory)
{
factory.register(MyEchoSocket.class);
}
};
server.addHandler(wsHandler);
server.start();
server.join();
Это создаст простой сервер, который обрабатывает 1 контекст, корневой контекст.
http://localhost:8080/
Если вы хотите связать WebSocketHandler с другим контекстом, оберните его в ContextHandler.
Server server = new Server(8080);
WebSocketHandler wsHandler = new WebSocketHandler()
{
@Override
public void configure(WebSocketServletFactory factory)
{
factory.register(MyEchoSocket.class);
}
};
ContextHandler context = new ContextHandler();
context.setContextPath("/echo");
context.setHandler(wsHandler);
server.addHandler(context);
server.start();
server.join();
Это привяжет ваш websocket к
http://localhost:8080/echo/
Ответ 2
Вот подход сервлетов:
1) В этом случае не нужно использовать этот код (это ответственность контейнера):
Server server = new Server(8080);
server.start();
server.join();
2) Создайте дескриптор web.xml для сервлета:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>WebSocket application</display-name>
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>com.example.websocket.JettyWebSocketServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
Теперь, когда вы пишете JS:
var ws = new WebSocket("ws://localhost:8080/hello");
ws.send("text");
обрабатывается с помощью метода onText вашего MyEchoSocket
Вот учебник для более глубокого понимания сервлетов, tutorial
Удачи.