Пусть тут пока полежит... Качаем
Кстати это то, чего практически не делают на просторах сети. Ну разве так сложно выложить вместе с кусками кода в блоге еще и архив с проектом? Намерен эту ошибку интернета исправлять примером.
Что для этого надо?
Сердце любой веб-аппки. Говорим, что будет один сервлет, он будет отвечать на запросы типа http://127.0.0.1:8080/ws
Сервлет обработчик
Welcome page для тестирования подключения
Main класс - раннер
Конечно же это все можно запустить плагином maven, а потому вот pom.xml
Уверен пригодится...
Кстати это то, чего практически не делают на просторах сети. Ну разве так сложно выложить вместе с кусками кода в блоге еще и архив с проектом? Намерен эту ошибку интернета исправлять примером.
Что для этого надо?
Сердце любой веб-аппки. Говорим, что будет один сервлет, он будет отвечать на запросы типа http://127.0.0.1:8080/ws
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name<WebSocketServer</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <servlet> <servlet-name>wsServlet</servlet-name> <servlet-class>com.apofig.SampleWebSocketServlet</servlet-class> <load-on-startup>100</load-on-startup> </servlet> <servlet-mapping> <servlet-name>wsServlet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> </web-app>
Сервлет обработчик
package com.apofig; import org.eclipse.jetty.websocket.WebSocket; import org.eclipse.jetty.websocket.WebSocketServlet; import javax.servlet.http.HttpServletRequest; public class SampleWebSocketServlet extends WebSocketServlet { @Override public WebSocket doWebSocketConnect(HttpServletRequest httpRequest, String protocol) { final String id = httpRequest.getParameter("id"); return new WebSocket.OnTextMessage() { @Override public void onMessage(String data) { System.out.println(id + " message > " + data); } @Override public void onOpen(WebSocket.Connection connection) { System.out.println(id + " open"); } @Override public void onClose(int closeCode, String message) { System.out.println(id + " close"); } }; } }
Welcome page для тестирования подключения
<!DOCTYPE html> <meta http-equiv="Content-Type" content="text/html;charset=UTF8"> <html> <head> <title>Websocket Sample</title> <script> // Спасибо http://learn.javascript.ru/websockets var id = Math.floor(Math.random()*10000); var socket = new WebSocket("ws://127.0.0.1:8080/ws?id=" + id); socket.onopen = function() { alert("Соединение установлено для id=" + id); var data = "some data"; socket.send(data); alert("Отправлены данные '" + data + "'"); }; socket.onclose = function(event) { if (event.wasClean) { alert('Соединение закрыто чисто'); } else { alert('Обрыв соединения'); // например, "убит" процесс сервера } alert('Код: ' + event.code + ' причина: ' + event.reason); }; socket.onmessage = function(event) { alert("Получены данные " + event.data); }; socket.onerror = function(error) { alert("Ошибка " + error.message); }; </script> </head> <body> </body> </html>
Main класс - раннер
package com.apofig; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; public class Main { public static void main(String[] args) throws Exception{ String webappDirLocation = "src/main/webapp/"; String webPort = System.getenv("PORT"); if(webPort == null || webPort.isEmpty()) { webPort = "8080"; } Server server = new Server(Integer.valueOf(webPort)); WebAppContext root = new WebAppContext(); root.setContextPath("/"); root.setDescriptor(webappDirLocation+"/WEB-INF/web.xml"); root.setResourceBase(webappDirLocation); root.setParentLoaderPriority(true); server.setHandler(root); server.start(); server.join(); } }
Конечно же это все можно запустить плагином maven, а потому вот pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>WebSocketServer</groupId> <artifactId>WebSocketServer</artifactId> <version>1.0-SNAPSHOT</version> <properties> <jetty.version>8.1.10.v20130312</jetty.version> </properties> <dependencies> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>${jetty.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-client</artifactId> <version>${jetty.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-webapp</artifactId> <version>${jetty.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-jsp</artifactId> <version>${jetty.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-websocket</artifactId> <version>${jetty.version}</version> <scope>compile</scope> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <filtering>true</filtering> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>${jetty.version}</version> <configuration> <webApp> <contextPath>/</contextPath> </webApp> <stopPort>9999</stopPort> <stopKey>foo</stopKey> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <encoding>utf8</encoding> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-jspc-maven-plugin</artifactId> <version>${jetty.version}</version> <executions> <execution> <id>jspc</id> <goals> <goal>jspc</goal> </goals> <configuration> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <webXml>${basedir}/target/web.xml</webXml> </configuration> </plugin> </plugins> </build> </project>
Уверен пригодится...
Есть такой замечательный фреймворк Atmosphere. По идее работает на любых сервлет-контейнерах. Например Atmosphere используется в некоторых компонентах Primefaces
ОтветитьУдалитьhttps://github.com/Atmosphere/atmosphere
А можете поподробнее пояснить про:
ОтветитьУдалить// TODO тут опасно, class cast на разных версиях jetty при деплое может возникнуть?
У меня на встроенном в eclipse нормально работает, а при деплое не работает.
Не уходит сообщение от клиента на сервер. Версия jetty 8.1.13
А в чем может быть по вашему причина?
УдалитьВозможно в том, что проект деплоится где-то в в дебрях диска C../../..temp/.. и я пока не знаю как это поменять (очень много документации, все сразу не изучишь), больше пока нет идей :)
ОтветитьУдалитьА опишите, пожалуйста весь процесс запуска проложения, как для бабушки. Чтобы иметь контекст.
Удалить
Удалитьeclipse kepler:
. . . main { . . . server = new Server(8080);
server.setHandler(new WebAppContext("WebContent", "/MyApp"));
server.start();
server.join(); . . . } . . . - Далее -> ServerRunner.java - Run As Java Application - так работает.
А вот если Project -> Export -> WAR file -> D:\Java\jetty-8.1.13\webapps\MyApp.war ->
далее батник:
cd d:\Java\jetty-8.1.13
d:
java -jar start.jar - все работает кроме WebSocket, даже Hibernate ;), (просто он тоже не просто так запускается)
Проект деплоится в C:\Users\my-name\AppData\Local\Temp\jetty-0.0.0.0-8080-MyApp.war-_MyApp-any-\webapp
Библиотеки добавлены: Project -> Properties -> Java Build Path -> Add Library и часть в WEB-INF/lib для JSTL
Запускается и первый и второй вариант одинаково - http://my-name:8080/MyApp в FireFox
Можете, пожалуйста, собрть мне в zip сбилдженное web приложение вместе с вашим джетти, батником и всеми всеми запчастями. Попробую у себя поднять. Сложно так сразу сообрзить.
УдалитьМне кажется, что Project -> Export -> WAR не совсем корректный путь. Попробуйте через
mvn clean -> почистит target
mvn package -> скомпилит проект
mvn war:war -> соверет варник, с которым джетти должен подружиться.
Прием.
Собрал проект :
Удалить[url=http://webfile.ru/32f30a04194263ebded68e36905bec17]СкачатьWebSocket.zip[/url]
СкачатьWebSocket.zip
(точнее его мини-часть, так как он использует DBOracle). Но проблема уже решена удалением вот этих двух строк:
Request request = (Request)httpRequest;
// TODO тут опасно, class cast на разных версиях jetty при деплое может возникнуть
final String remote = request.getRemoteAddr() + ":" + request.getRemotePort();
и соответственно переменной remote отовсюду.
Это я сделал после того как получил Runtime.Error по поводу NoClassDefinition - Request
в этом маленьком проекте. Значит скорей всего проблема была в библиотеках.
Пора начинать похоже использовать maven. Большое спасибо за помощь!
Александр, очень рад!
УдалитьМавен не без проблем, но он и вправду вас ускорит после ручной сборки и менеджмента библиотек.
Ту строчку я удалил из описания в блоге - спасибо!
Пишите, если что
Обновил исходники:
Удалить1) устранил ClassCast
2) добавил html/javascript код для демонстрации общения клиент+сервер