Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Многопоточность на сервере


Автор: Samotnik 3.11.2007, 21:14
Добрый день!
Значит есть серверное приложение и в нем метод, который обрабатывает коннект клиента
Код

 public void connectClient ( )  {

    if ( ! ( portDisplay.getText () ).equals ( "" ) ) port = Integer.parseInt ( portDisplay.getText () );
    else port = DEFAULT_PORT;

    try  {

      listenSocket = new ServerSocket ( port );
      logDisplay.setText ( "Server running on "+host+", port "+port+"\n" );

      connection = listenSocket.accept ();

      outStream = connection.getOutputStream ();
      outDataStream = new DataOutputStream ( outStream );
      inStream = connection.getInputStream ();
      inDataStream = new DataInputStream ( inStream );

      logDisplay.appendText ( "Connection request received\n" );
      logDisplay.appendText ( "Message, below, received\n" );

      try {
        message = inDataStream.readUTF ();
        msgDisplay.setForeground ( Color.red );
        msgDisplay.appendText ( message );
        }  // end try for input
      catch ( EOFException except ) {
        logDisplay.appendText ( "message EOF received\n" );
        }  // end catch
      catch ( IOException except ) {
        System.out.println ( "IO Exception raised" );
        except.printStackTrace ();
        }  // end catch

      System.out.println ("Getting ready to return message");
      message = msgDisplay.getText ();
      logDisplay.appendText ( "Message, below, returned to client \n" );
      outDataStream.writeUTF ( message );
      logDisplay.appendText ( "Connection closed\n" );
      connection.close ();
      return;

    }  // end try

    catch ( IOException except)  {
      except.printStackTrace ();
    }  // end catch

  } 

Как в этот кусок кода вставить многопоточность? Чтоб на каждого нового клиента, выделялся новый сокет от сервера. А то этот код работает только с одним клиентом (((  smile 

Автор: Samotnik 3.11.2007, 21:48
Может  у кого-нить  есть примеры  работы многопоточной модели  "клиент-сервер"  ???
Скиньте посмотреть пожалуйсто, ОЧЕНЬ нужно  smile  smile  smile 
 smile  

Автор: _Michael 5.11.2007, 14:04
ServerSocket s = new ServerSocket(int port);
Socket newClientSocket = s.accept();
Ставишь в отдельном потоке, и если ассепт то новый поток для новоподключенного клиента smile Уже вроде обсуждалось где-то.

Автор: valiantsin 5.11.2007, 14:26
Уважаемый Samotnik, возможно Вам подойдет пример этого кода:
Код

public class NetworkGenerator implements  Runnable {
    private Socket socket;
    private InputStream inputStream;
    private Thread th;
    private boolean active = true;
    private ServerForGenerator newServerForGenerator;


    public NetworkGenerator(int port, Dimension size) {
        newServerForGenerator = new ServerForGenerator(port, size);// Создает сервер для генератора

        try {// Открывает сокетное соединение
            socket = new Socket("localhost", port);
            inputStream = socket.getInputStream();
        } catch (Exception e) {
            System.out.println("" + e);
        }

        th = new Thread(this);// Создаем поток
        th.setDaemon(true);
        th.start();// Стартуем поток
    }

    public void run() {
        while (active) {
            try {
                int x = inputStream.read(), // Поочереди принимает два некоторых сгенерированных значения                y = inputStream.read();


            } catch (IOException e) {
                System.out.println("" + e);
            }
        }
    }

    public void stop() {
        active = false;
        newServerForGenerator.stop();
        newServerForGenerator = null;

    }

}


class ServerForGenerator implements Runnable {
    ServerSocket serverSocket;
    Socket socket;
    Thread threadForListen;
    OutputStream outputStream;
    Dimension size;
    Timer timer;


    public ServerForGenerator(int port, Dimension size) {

        this.size = size;

        try {
            serverSocket = new ServerSocket(port);// создаем серверный сокет
        } catch (IOException e) {
            System.out.println("" + e);
        }
        threadForListen = new Thread(this);// запускаем поток, КОТОрый слушает соединения
        threadForListen.setDaemon(true);
        threadForListen.start();
    }

    public void run() {
        try {
            socket = serverSocket.accept();// если есть запрос на соединение, ТО соединяемся
            outputStream = socket.getOutputStream();
        } catch (IOException e) {
            System.out.println("" + e);
        }
        // что-то тут сделать например:
        timer = new Timer("some timer");
                                if (outputStream != null) {
            try {// на событие таймера пересылаем два некоторых числа клиенту. Посылаем по порядку
                outputStream.write((int) (Math.random() * 100000 % size.width));
                outputStream.write((int) (Math.random() * 100000 % size.width));
            } catch (IOException ex) {
                System.out.println("" + ex);
            }
            } else {

        }
    }

    public void stop() {
        try {
            socket.close();// если стоп, то закрываем сокет.
            serverSocket.close();
            outputStream.close();

            serverSocket = null;
            socket = null;
            outputStream = null;
            timer = null;

        } catch (Exception e) {
            System.out.println("" + e);
        }
    }
}
 
Хотя я возможно просто не понял вопрос...

Автор: Platon 5.11.2007, 20:33
Samotnik,  smile  интересно, а для кого я свою статью написал?
Попробуй своё приложение оформить на базе Apache MINA.

Автор: Samotnik 6.11.2007, 00:03
Цитата(Platon @  5.11.2007,  20:33 Найти цитируемый пост)
интересно, а для кого я свою статью написал?

Какую, где ее найти можно??

Автор: Platon 6.11.2007, 00:05
Ак ты ж ее видел уже...
http://forum.vingrad.ru/faq/topic-177795.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)