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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите нормально сделать сокеты 
:(
    Опции темы
Anton Vatchenko
Дата 20.12.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Взял пример из статьи. Работает. Но как сделать полноценный сервер: запустить его, и чтобы он ожидал всех соединений, а не только одного??? Итак:
1. Как запустить на удаленной машине нормальный сервер?
2. Как сделать чтобы сервер работал с сотней параллельных соединений?
3. Как сделать чтобы сервер не прекращал работу?

Код

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;

public class Socket {

    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(9000);
        java.net.Socket s = ss.accept();
        PrintWriter out = new PrintWriter(s.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(s
                .getInputStream()));
        int ch = -1;
        while ((ch = in.read()) != -1) {
            System.out.println(ch);
            out.println(ch);
        }
        out.close();
        in.close();
        s.close();
        // ss.close();
    }

}



--------------------
user posted image
PM MAIL   Вверх
COVD
Дата 20.12.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Примеров много можно найти. У Эккеля, например:

Код

//: c15:MultiJabberServer.java
// Сервер, использующий многопоточность 
// для обслуживания любого числа клиентов.
import java.io.*;
import java.net.*;

class ServeOneJabber extends Thread {
  private Socket socket;
  private BufferedReader in;
  private PrintWriter out;
  public ServeOneJabber(Socket s) 
      throws IOException {
    socket = s;
    in = 
      new BufferedReader(
        new InputStreamReader(
          socket.getInputStream()));
    // Включение автосброса буферов:
    out = 
      new PrintWriter(
        new BufferedWriter(
          new OutputStreamWriter(
            socket.getOutputStream())), true);
    // Если какой либо, указанный выше класс выбросит исключение 
    // вызывающая процедура ответственна за закрытие сокета
    // В противном случае нить(поток) закроет его.

    start(); // Вызывает run()
  }
  public void run() {
    try {
      while (true) {  
        String str = in.readLine();
        if (str.equals("END")) break;
        System.out.println("Echoing: " + str);
        out.println(str);
      }
      System.out.println("closing...");
    } catch(IOException e) {
      System.err.println("IO Exception");
    } finally {
      try {
        socket.close();
      } catch(IOException e) {
        System.err.println("Socket not closed");
      }
    }
  }
}

public class MultiJabberServer {  
  static final int PORT = 8080;
  public static void main(String[] args)
      throws IOException {
    ServerSocket s = new ServerSocket(PORT);
    System.out.println("Server Started");
    try {
      while(true) {
        // Останавливает выполнение, до нового соединения:
        Socket socket = s.accept();
        try {
          new ServeOneJabber(socket);
        } catch(IOException e) {
          // Если неудача - закрываем сокет,
          // в противном случае нить закроет его:
          socket.close();
        }
      }
    } finally {
      s.close();
    }
  } 
} ///:~

PM MAIL   Вверх
Anton Vatchenko
Дата 20.12.2006, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пасибо... Но если на сервак ставить, то это не обязательно должен быть сервлет?


--------------------
user posted image
PM MAIL   Вверх
BlackStar
Дата 20.12.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ты что то путаешь при чем тут сервлет?
PM MAIL Jabber   Вверх
Anton Vatchenko
Дата 20.12.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



BlackStar, ну я же пишу серверное приложение... Это что, может быть обычное приложение java с main?


--------------------
user posted image
PM MAIL   Вверх
BlackStar
Дата 20.12.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Это должно быть обычным приложением.

http://ru.wikipedia.org/wiki/Сервлет



Это сообщение отредактировал(а) BlackStar - 20.12.2006, 17:21
PM MAIL Jabber   Вверх
COVD
Дата 20.12.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Цитата

я же пишу серверное приложение... 


Если вы пишете HTTP сервер, то вам надо использовать Томсат, например. Все операции с сокетами, потоками и прочим там внутри реализованы. Вам остается только установить его и программировать обработку запросов в сервлетах.
PM MAIL   Вверх
Anton Vatchenko
Дата 21.12.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот я и хочу в Томкате сделать сокеты... это я так понял через сервлеты!? Как конкретно? Как запускать операцию прослушивания?


--------------------
user posted image
PM MAIL   Вверх
tux
Дата 21.12.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Anton Vatchenko, давай точно определимся с тем, что тебе нужно. Томкат и сокеты между собой напрямую никак не связаны. Томкат позволяет запускать сервлеты, сервлеты работают по HTTP-протоколу, HTTP-протокол в свою очередь реализован с использованием сокетов. Но для того чтобы сокеты работали, тебе никакой Томкат не нужен, он нужен для того, чтобы развернуть сервлеты. Можно конечно внутри приложения, которое на Томкате работает, запустить прослушивание сокетов, но с тем же успехом это можно сделать и без Томката. Так что тебе нужно? Сокеты, сервлеты или сокеты на Томкате. Если все-таки сокеты на Томкате, то все делается точно так же как и без Томката.

Это сообщение отредактировал(а) tux - 21.12.2006, 13:11
PM MAIL Skype GTalk Jabber YIM   Вверх
Anton Vatchenko
Дата 21.12.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Еще раз опишу то, что у меня есть, вдруг что-то упустил.
1. Есть удаленный сервер. На нем стоит Томкат под Юнихом.
2. Мне нужно написать приложение, чтобы запустить его на сервере, чтобы оно прослушивало определенный порт.

Какое приложение нужно писать? Как его запустить на удаленном сервере, чтобы я его мог запустить на прослушивание, уйти куда-то гулять (отсоединиться от сервера), потом прийти и выключить прослушивание?


--------------------
user posted image
PM MAIL   Вверх
tux
Дата 21.12.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Anton Vatchenko, давай еще раз. Для того, чтобы прослушивать сокеты достаточно простого java-приложения безо всякого Томката. Для того, чтобы подключиться к сокету на удаленной машине тоже достаточно простого java-приложения. То есть у нас, грубо говоря, один просто java-объект взаимодействует с другим просто java-объектом используя сокеты. Даже если ты к этой структуре где-то сбоку прилепишь Томкат, все равно это будет так. О сокетах можно почитать и посмотреть примеры здесь и здесь. Внимание, вопрос. В каком качестве здесь должен фигурировать Томкат? Из твоей постановки задачи это совершенно не понятно. Или это просто информация к размышлению то, что он на сервере запущен? Или я совершенно ничего не понимаю?

Добавлено @ 13:46 
Или тебе таки нужен и удаленный запуск того объекта, который будет прослушивать сокет?
PM MAIL Skype GTalk Jabber YIM   Вверх
Anton Vatchenko
Дата 21.12.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я понимаю что одно java-приложение будет общаться с другим. Но до этого еще один этап: нужно запустить то приложение, которое будет прослушивать сокеты, на сервере. Как обычно запускается такая задача? Пока что на сервере ничего толкового не нашел, кроме как деплоймента на томкате...


--------------------
user posted image
PM MAIL   Вверх
tux
Дата 21.12.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Ясно наконец.
Цитата(Anton Vatchenko @  20.12.2006,  14:14 Найти цитируемый пост)
1. Как запустить на удаленной машине нормальный сервер?

Если с Томкатом, то простейший вариант написать простое веб-приложение, в котором определить ServletContextListener. Он будет стартовать при запуске приложения и существует на протяжении всего времени жизни приложения. Наверное прослушивание сокета можно реализовать в нем. Описывается примерно так:
Код

<web-app>
    <listener>
        <listener-class>
            MyContextListener
        </listener-class>
    </listener>
</web-app>

Класс MyContextListener должен реализовывать интерфейс javax.servlet.ServletContextListener.

Цитата(Anton Vatchenko @  20.12.2006,  14:14 Найти цитируемый пост)
2. Как сделать чтобы сервер работал с сотней параллельных соединений?

Для каждого запроса создается отдельный поток. Потоки работают параллельно, поэтому будет возможность обслуживать большое число соединений. Здесь пример реализации многопоточного чат-сервера - http://www.acm.org/crossroads/xrds6-1/ovp61.html. Надеюсь даст какие-то идеи. Вообще создание и разрушение потоков - это простейший вариант, обычно используют пул потоков, который лучше с точки зрения производительности, но это уже другая история.

Цитата(Anton Vatchenko @  20.12.2006,  14:14 Найти цитируемый пост)
3. Как сделать чтобы сервер не прекращал работу?

Пока Томкат работает, должен жить.
PM MAIL Skype GTalk Jabber YIM   Вверх
tux
Дата 21.12.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



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

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

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


 




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


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

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