- Saved searches
- Use saved searches to filter your results more quickly
- License
- TooTallNate/Java-WebSocket
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.markdown
- About
- WebSocket: Реализация web-приложения с использованием Jetty Web Socket. Часть 1
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
A barebones WebSocket client and server implementation written in 100% Java.
License
TooTallNate/Java-WebSocket
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.markdown
This repository contains a barebones WebSocket server and client implementation written in 100% Java. The underlying classes are implemented java.nio , which allows for a non-blocking event-driven model (similar to the WebSocket API for web browsers).
Implemented WebSocket protocol versions are:
Here some more details about protocol versions/drafts. PerMessageDeflateExample enable the extension with reference to both a server and client example.
Dependency management tools
Below is a brief guide to using dependency management tools like maven or gradle.
To use maven add this dependency to your pom.xml:
dependency> groupId>org.java-websocketgroupId> artifactId>Java-WebSocketartifactId> version>1.5.3version> dependency>
To use Gradle add the maven central repository to your repositories list:
Then you can just add the latest version to your build.
compile "org.java-websocket:Java-WebSocket:1.5.3"
Or this option if you use gradle 7.0 and above.
implementation 'org.java-websocket:Java-WebSocket:1.5.3'
This library uses SLF4J for logging and does not ship with any default logging implementation.
Exceptions are using the log level ERROR and debug logging will be done with log level TRACE .
Feel free to use whichever logging framework you desire and use the corresponding binding in your dependency management.
If you want to get started, take a look at the SimpleLogger example.
If you do not use any dependency management tool, you can find the latest standalone jar here.
Writing your own WebSocket Server
The org.java_websocket.server.WebSocketServer abstract class implements the server-side of the WebSocket Protocol. A WebSocket server by itself doesn’t do anything except establish socket connections though HTTP. After that it’s up to your subclass to add purpose.
An example for a WebSocketServer can be found in both the wiki and the example folder.
Writing your own WebSocket Client
The org.java_websocket.client.WebSocketClient abstract class can connect to valid WebSocket servers. The constructor expects a valid ws:// URI to connect to. Important events onOpen , onClose , onMessage and onError get fired throughout the life of the WebSocketClient, and must be implemented in your subclass.
An example for a WebSocketClient can be found in both the wiki and the example folder.
You can find a lot of examples here.
This library supports wss. To see how to use wss please take a look at the examples.
If you do not have a valid certificate in place then you will have to create a self signed one. Browsers will simply refuse the connection in case of a bad certificate and will not ask the user to accept it. So the first step will be to make a browser to accept your self signed certificate. ( https://bugzilla.mozilla.org/show_bug.cgi?id=594502 ).
If the websocket server url is wss://localhost:8000 visit the url https://localhost:8000 with your browser. The browser will recognize the handshake and allow you to accept the certificate.
The vm option -Djavax.net.debug=all can help to find out if there is a problem with the certificate.
It is currently not possible to accept ws and wss connections at the same time via the same websocket server instance.
For some reason Firefox does not allow multiple connections to the same wss server if the server uses a different port than the default port (443).
If you want to use wss on the android platform you should take a look at this.
I ( @Davidiusdadi ) would be glad if you would give some feedback whether wss is working fine for you or not.
Java-WebSocket is known to work with:
Other JRE implementations may work as well, but haven’t been tested.
Everything found in this repo is licensed under an MIT license. See the LICENSE file for specifics.
About
A barebones WebSocket client and server implementation written in 100% Java.
WebSocket: Реализация web-приложения с использованием Jetty Web Socket. Часть 1
Поздравляю всех и каждого с великим Днем Программиста! Желаю рабочего кода, уверенных сокетов и самых продвинутых пользователей!
Работая над автоматизацией концертного агентства, мне на каком-то этапе разработки понадобилась система уведомлений. Доступ к автоматизации происходит через написанное мною web-приложение. И, соответственно, моментальные уведомления должны приходить в браузер пользователя.
- браузер отправляет запрос каждую секунду создавая лишнюю нагрузку на:
- сервер;
- ОС, на которой работает браузер;
- и еще раз на сервер, так как сервер постоянно выполняет запрос БД на выборку последних уведомлений.
Среди минусов WebSocket важен только тот, что его пока поддерживают только браузеры webkit (они же Google Chrome и Apple Safari).
Давайте попробуем реализовать простой чат, как web-приложение c базовой возможностью полнодуплексного обмена сообщениями между клиентом и сервером.
Реализация клиентской части
Реализация WebSocket-ов на JavaScript на клиентской стороне простая, на неё не будем тратить много времени. Смотрим листинг.
var socket = new WebSocket("ws://myserver.com:8081/"); socket.onopen = function () < console.log("Соединение открылось"); >; socket.onclose = function () < console.log ("Соединение закрылось"); >; socket.onmessage = function (event) < console.log ("Пришло сообщение с содержанием:", event.data); >;
Отправлять сообщения на сервер можно методом send():
socket.send(messageString);Реализация серверной части
Что мы имеем? Давайте взглянем на схему.
В моем случае мы имеем контейнер сервлетов GlassFish на порту 8080. Браузер отправляет запрос на GlassFish [1], который передает браузеру страничку чата [2], которая по желанию пользователя соединяется с сервером через порт 8081 по протоколу WebSocket [3]. Далее происходит полнодуплексный обмен данными между браузером и сервером [4].
- jetty-continuation-8.0.1.v20110908.jar,
- jetty-http-8.0.1.v20110908.jar,
- jetty-io-8.0.1.v20110908.jar,
- jetty-server-8.0.1.v20110908.jar,
- jetty-util-8.0.1.v20110908.jar,
- jetty-websocket-8.0.1.v20110908.jar.
Возвращаясь к клиентской части, скачиваем ее отсюда (не хочу засорять пост листингом HTML-кода). Добавляем файл chat.html в Web Pages проекта. В дескрипторе развёртывания (web.xml) указываем chat.html как «welcome-file».
Embedded-сервер Jetty находится в классе org.eclipse.jetty.server.Server. И конструктор может содержать либо адрес сервера, либо, как в нашем случае номер порта:
Server jetty = new Server(8081);
Далее нам нужно добавить в jetty нужные handlerы и запустить его. Запускается и останавливается jetty методами без параметров start() и stop() соответственно. А вот handler нам надо будет написать свой, создаем новый класс. Чтобы у нас был handler для обработки соединений по протоколу WebSocket, мы должны его наследовать от org.eclipse.jetty.websocket.WebSocketHandler:
public class ChatWebSocketHandler extends WebSocketHandler …
>
У класса WebSocketHandler есть один абстрактный метод doWebSocketConnect(). Он, собственно, и вызывается, когда браузер открывает новое соединение с jetty, и возвращает объект WebSocketа.- onOpen() – вызывается после открытия сокета;
- onClose() – вызывается перед закрытием сокета;
- onMessage() – вызывается когда приходит сообщение от клиента.
- 1 свойство – набор сокетов;
- 1 метод, который нам создает и возвращает новый сокет;
- 1 приватный класс, который реализует этот WebSocket.
Что из себя представляет протокол обмена?
- /auth ник //Для авторизации
- /getUsers //Для получения списка пользователей
- /help //Для получения помощи
- inf|информация // Пришла информация
- in|ник|сообщение // Входящее сообщение от пользователя ник
- out|сообщение // Мое сообщение отправлено
- err|ошибка // Пришла информация об ошибке
Теперь перейдем к самому ответственному моменту — запуск сервера jetty. Значит, у нас задача: при старте контейнера сервлетов запустить jetty; перед остановкой контейнера сервлетов — остановить jetty. Самый простой способ это реализовать в GlassFish — написать свой ContextListener. Давайте посмотрим почему? Создаем новый класс и наследуем его от интерфейса javax.servlet.ServletContextListener. Смотрим листинг.
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.DefaultHandler; public class ChatServerServletContextListener implements ServletContextListener < /** * Хранилище сервера Jetty */ private Server server = null; /** * Метод вызывается когда контейнер сервлетов запускается * @param event */ @Override public void contextInitialized(ServletContextEvent event) < try < // Создание сервера Jetty на 8081 порту this.server = new Server(8081); // Регистрируем ChatWebSocketHandler в сервере Jetty ChatWebSocketHandler chatWebSocketHandler = new ChatWebSocketHandler(); // Это вариант хэндлера для WebSocketHandlerContainer chatWebSocketHandler.setHandler(new DefaultHandler()); // Вставляем наш хэндлер слушаться jetty server.setHandler(chatWebSocketHandler); // Запускаем Jetty server.start(); >catch (Throwable e) < e.printStackTrace(); >> /** * Метод вызывается когда контейнер сервлетов останавливается * @param event */ @Override public void contextDestroyed(ServletContextEvent event) < // Если сервер jetty когда-нибудь запустился if (server != null) < try < // останавливаем Jetty server.stop(); >catch (Exception e) < e.printStackTrace(); >> > >
Интерфейс javax.servlet.ServletContextListener имеет два метода с говорящими самими за себя именами: contextInitialized(), contextDestroyed().
Теперь нам остается только подключить наш ContextListener в дескриптор развёртывания (web.xml). Приведу его листинг:
30 chat.html ChatServerServletContextListener Ну теперь можно и запустить проект. В браузере открываем сразу два окна и балуемся. Прошу обратить внимание на время, сообщения доходят практически моментально. Такую скорость работы на ajax получить практически невозможно.
Заключение
Весь проект в сборе можно скачать по ссылке
Проект полностью совместим с GlassFish 2.x, 3.x и Tomcat не ниже 5.0. Проект создавал в Netbeans 7.0.1. Внутри проекта можно найти ant-deploy.xml для развертки на Ant. Еще раз дико извиняюсь перед разработчиками, использующих Maven.Во второй части статьи я подробно опишу проблемы, которые возникают при работе с WebSocket, и их решения.
В третьей части я опишу способы борьбы с ddos-атаками на серверы Jetty.Спасибо за внимание. Всех еще раз с праздником!