Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WebSocket (Java сервер) 
:(
    Опции темы
AbSs
Дата 2.7.2010, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 2.7.2010

Репутация: нет
Всего: нет



Добрый вечер. 
Сразу скажу что в программировании клиент-серверных приложений новичок, как и в программировании на Java.
В общем решил попробовать WebSocket. Прочитал кучу документации по протоколу, по сокетам для Java и решил попробовать.

Написал простенький сервер который работает в один поток и только с одним соединением:
Код

package echowebsocketserver;

import exception.WebSocketHandshakeException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import util.WebSocketHandshake;

/**
 *
 * @author AbS_
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public final static int port = 80;
    public final static String host = new String("localhost");

    public static void main(String[] args) throws Exception {
        InetAddress ia = InetAddress.getByName(host);
        ServerSocket ss = new ServerSocket(port, 0, ia);
        System.out.println("Socket create " + ss);
        boolean doWork = true;


        try {
            while (doWork) {
                Socket socet = ss.accept();

                try {
                    System.out.println("Connected: " + socet);
                    InputStream in = socet.getInputStream();
                    OutputStream out = socet.getOutputStream();
                    
                    String data = null;
                    byte[] buf = new byte[1024];
                    int r = in.read(buf);

                   // data = new String(buf, 0, r - 8);
                   // System.out.println("data: res byte[]: " + r + " - len: " + data.length() + "\n" + data);

                    buf = WebSocketHandshake.getResponsHandshake(buf, r);

                    //System.out.println(new String(buf));
                    out.write(buf);

                    r = wrap("Привет: " + socet.getInetAddress(), buf);
                    out.write(buf, 0, r);
                    while (true) {
                        r = in.read(buf);
                        if (r == -1) {
                            System.out.println("\r\nDisconnect\r\n");
                            break;
                        }

                        System.out.println("Read bytes: " + r);
                        data = unwrap(buf, r);
                        System.out.println("Input data: " + data);

                        if (data.equalsIgnoreCase("stop")) {
                            doWork = false;
                            break;
                        } else if (data.equalsIgnoreCase("ping")) {
                            r = wrap("pong", buf);
                            out.write(buf, 0, r);
                        } else if (data.equalsIgnoreCase("pong")) {
                            //ничего не делаем)
                        } else {
                            r = wrap(data, buf);
                            out.write(buf, 0, r);
                        }
                    }
                } catch (WebSocketHandshakeException he) {
                    socet.close();
                } finally {
                    socet.close();
                }
            }

        } finally {
            ss.close();
        }
    }

    private static String unwrap(byte[] msg, int len) throws UnsupportedEncodingException {
        byte[] buf = new byte[len - 2];
        System.arraycopy(msg, 1, buf, 0, len - 2);
        return new String(buf, "UTF-8");
    }

    private static int wrap(String msg, byte[] dest) throws UnsupportedEncodingException {
        byte[] buf = msg.getBytes("UTF-8");
        int len = buf.length;
        dest[0] = (byte) 0x00;
        System.arraycopy(buf, 0, dest, 1, len);
        dest[len + 1] = (byte) 0xFF;

        return len + 2;
    }
}


Сервер нормально работает на локальной машине, но возникают проблемы при работе через интерент.
А именно почему то не приходят сообщения от клиентов, хотя происходит инициализация соединения, отправка handshake, и даже отправка и получение(клиентом) приветственного сообщения
( "Привет: " + socet.getInetAddress()). Но вот дальше этого дело не двигается, сервер блокируется как и положенно на in.read(buf); и все, хотя при тестах на локальной машине все работает нормально.

В общем у меня вопрос, это могут быть проблемы с сетью, с моим кривым сервером или я что то совершенно не так делаю?


Это сообщение отредактировал(а) AbSs - 2.7.2010, 15:45
PM MAIL   Вверх
lazycat
Дата 9.7.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 15.7.2007

Репутация: нет
Всего: 1



Я думаю, самый лучший способ разобраться, что тут не так - действовать поэтапно. Лично я бы сначала отказался от WebSocketHandshake и убедился в том, что данные передаются и принимаются через Socket, возвращаемый методом accept(). 
И еще одна рекомендация: учтите, что Web-клиент, отправив запрос, не закрывает поток, поэтому у Вас вполне возможно зависание на строке
int r = in.read(buf);

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0871 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.