WebSockets, GlassFish, Grizzly — не удается подключиться

#java #websocket #glassfish-3 #grizzly

#java #websocket #glassfish-3 #grizzly

Вопрос:

Я пытаюсь начать работу с WebSockets и пытаюсь написать простое приложение для отправки сообщений туда и обратно через websoket.

Однако похоже, что сокет, который я пытаюсь создать, никогда не подключается. Почему это может быть?

Ниже приведен код моего класса WebSockets. При .onConnect() вызове он регистрируется:

Я сокет, я был подключен. Я подключен? — ложь

Обновление: в JavaScript, где я создаю соответствующий сокет, readyState is 1 , что означает «сокет открыт, связь возможна».

 import a.b.Misc; //writes logs.

import com.sun.grizzly.websockets.BaseServerWebSocket;
import com.sun.grizzly.websockets.DataFrame;
import com.sun.grizzly.websockets.WebSocketListener;

public class ChatWebSocket_v2 extends BaseServerWebSocket {
    private String user;
    public ChatWebSocket_v2(WebSocketListener... listeners) {
        super(listeners);
    }
    public String getUser() {
        if (user == null) {
            Misc.print("User is null in ChatWebSocket");
            throw new NullPointerException(" =The user is null in chat web socket");
        }
        return user;
    }
    public void setUser(String user) {
        Misc.print("Just set user: "   user);
        this.user = user;
    }
    @Override
    public void onMessage(String message) {
        Misc.print(message  "n");
    }
    @Override
    public void onMessage(byte[] message) {
        Misc.print(new String(message)  " << Bytesn");
    }
    @Override 
    public void onConnect() {
        Misc.print("I am socket, i was connected. Am i connected? - "   this.isConnected());
    }
    @Override 
    public void onClose(DataFrame df) {
        Misc.print("I am socket, i was closed");
    }
}
  

Комментарии:

1. Пока нет намека на вашу награду? Приведенный ниже ответ позволит вам подключиться.

2. Извините, у меня еще не было возможности протестировать его. Но если вы сделаете promice, это сработает… Спасибо, приятель!

Ответ №1:

Если вы просто пытаетесь установить соединение где-нибудь, вы можете попробовать это вместо этого. Существует живая рабочая демонстрация, и вы можете скачать код javascript и поиграть с ним самостоятельно. Обратите внимание, что код javascript работает, только если он установлен на сервере (из-за безопасности браузера, потому что он «навороченный»). В работах также есть пошаговое руководство по работе с клиентами на основе браузера, которое я опубликую, как только оно будет готово. Большинство прокси-серверов не были обновлены для обработки websockets, поэтому они будут испортить запрос на подключение, и большинство людей не смогут подключиться к серверам websocket с работы. Firefox 7 (версия) или Google Chrome 14 или более поздней версии поддерживают последнюю версию протокола websocket, который работает на демонстрационном сервере.

Если вы хотите попробовать запустить демонстрационную версию grizzly, вам может потребоваться некоторая отладка, и, возможно, я помогу с этим. Обратите внимание, что в комментариях под статьей другие люди сказали, что они тоже не могут заставить ее работать, и я не нашел никаких последующих действий. На данный момент это кажется не лучше, чем приложение echo выше, даже если мы запустим его, и, возможно, оно слишком сложное и недостаточно документировано, если вы только пытаетесь начать. Но если вы хотите попытаться запустить его, вам следует «git» последнюю версию кода здесь, которая была, по крайней мере, недавно зафиксирована и может быть исправлена.

Затем убедитесь, что app.url в файле javascript приложения указан в вашем каталоге установки. Его жестко запрограммирован как:

 url: 'ws://localhost:8080/grizzly-websockets-chat/chat',
  

Если вы используете Firefox 7, javascript необходимо изменить, чтобы использовать префикс Moz, например:

   if (typeof MozWebSocket != "undefined") { // window.MozWebSocket or "MozWebSocket" in window
    ok
  } else if (window.WebSocket) {  // he uses  if ("WebSocket" in window)
    ok
  } else {
    do your print "browser doesn't support websockets"
  }
  .... then if the browser supports websockets
  websocket = new WebSocket(app.url); or
  websocket = new MozWebSocket(app.url); 
  // depending on which it is.
  

Демонстрационный код сервера HLL websocket с этим разобрался.

(еще одно) ОБНОВЛЕНИЕ: поскольку я сам работаю с grizzly, я обнаружил при быстром запуске в консоли администратора glassfish образец hello, который довольно легко настроить и запустить. Там вы найдете инструкции. Пример каталога также содержит файл war с именем: websocket-mozilla; поэтому я предполагаю, что он должен использовать websockets. Тот, кто знаком с jsp, должен просмотреть исходный код. Все, что я вижу, это то, что он использует HTTP-сеанс. Никакого упоминания о websocket вообще. Это очень похоже на пример hello.

Комментарии:

1. Это то, что я пытался. Это тот же код, что и у меня, но я просто выбросил несколько ненужных методов и добавил несколько своих. Я также создал приложение и сервлет, который его регистрирует. Я не показывал их здесь, так как кажется, что они работают, по крайней мере, вызывается .OnConnect в этом классе, поэтому сокет действительно создается. Это .onMessage, который не работает…

2. Я могу заняться этим сам. Я бы хотел, чтобы мой сервер общался с сервером grizzly. Может быть, сегодня. RE: Мой комментарий. Последовательность заключается в том, чтобы сначала установить соединение. Существует обновленная процедура рукопожатия, которую должны пройти «клиент» и сервер. В обучающей версии есть метод, который создает сокет для клиента и т. Д. (Я только что просмотрел. Я мог бы подробно остановиться на этом сегодня.) В вашей версии этого нет.

3. Как только я запущу grizzly, я также буду использовать свой клиент для связи с ним. highlevellogic.blogspot.com/2011/09 /…

4. Кстати: я довольно часто использовал Tomcat, но никогда не устанавливал Apache. Если у вас есть какие-либо советы по настройке grizzly и запуску вместе с образцом echo-сервера, возможно, мы сможем помочь друг другу.

5. Вы точно не устанавливаете Grizzly. Вы должны установить GlassFish с сайта Oracle, а Grizzly — это просто пакет, который вы можете найти в папке библиотеки GlassFish.