2013-07-14 2 views
2

У меня есть Java-программа, которая будет подключать клиента к серверу. Это включает в себя создание каталога файлов, когда клиент инициировал сервер путем отправки сообщения. Например: как только сервер будет запущен, клиент затем подключится и отправит сообщение msg ie «Ваше сообщение: Lady», сервер получит сообщение «Запрос на создание каталога с именем: Lady», после этого каталог будет создан по имени Леди.Соединение клиент-сервер

Но проблема в том, что это соединение происходит только для взаимно однозначного. Как только один клиент может подключиться к серверу ...

Это пример кода:

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package today._; 

import java.io.*; 

import java.net.*; 

import java.text.*; 

import java.util.*; 

public class myServer { 

    protected static final int PORT_NUMBER = 55555; 

    public static void main(String args[]) { 

     try { 

      ServerSocket servsock = new ServerSocket(PORT_NUMBER); 

      System.out.println("Server running..."); 

      while (true) { 
       Socket sock = servsock.accept(); 
       System.out.println("Connection from: " + sock.getInetAddress()); 
       Scanner in = new Scanner(sock.getInputStream()); 
       PrintWriter out = new PrintWriter(sock.getOutputStream()); 
       String request = ""; 
       while (in.hasNext()) { 
        request = in.next(); 
        System.out.println("Request to Create Directory named: " + request); 

      if(request.toUpperCase().equals("TIME")) { 
        try { 
         File file = new File("C:\\" + request); 
         if (!file.exists()) { 
          if (file.mkdir()) { 
           System.out.println("Directory is created!"); 
          } else { 
           System.out.println("Failed to create directory!"); 
          } 
         } 
        } catch (Exception e) { 
         System.out.println(e); 
        } 
        out.println(getTime()); 

        out.flush(); 
      } else { 
       out.println("Invalid Request...");      
       out.flush(); 
      } 
       } 

      } 


     } catch (Exception e) { 
      System.out.println(e.toString()); 
     } 

    } 

    protected static String getTime() { 
     DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
     Date date = new Date(); 
     return (dateFormat.format(date)); 
    } 
} 

package today._; 

import java.io.*; 

import java.net.*; 

import java.util.*; 

public class myClient { 

     protected static final String HOST = "localhost"; 
     protected static final int PORT = 55555; 

     protected static Socket sock; 

     public static void main(String args[]) { 

     try { 

       sock = new Socket(HOST,PORT); 

       System.out.println("Connected to " + HOST + " on port " + PORT); 

       Scanner response = new Scanner(sock.getInputStream()); 
       PrintWriter request = new PrintWriter(sock.getOutputStream()); 
       BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
       String txt = ""; 

       while(!txt.toUpperCase().equals("EXIT")) { 

        System.out.print("Your message:"); 
        txt = in.readLine(); 

        request.println(txt); 
        request.flush(); 

        System.out.println(response.next()); 

       } 

       request.close(); 
       response.close(); 
       in.close(); 
       sock.close(); 

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

} 
+2

Вам нужен один поток для каждого клиента на сервере. См. Конец этой учебной страницы: http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html –

ответ

2

серверы Multi-клиент, как правило, написаны один из двух способов:

  1. Создать тему для каждого клиента. Для этого вы создадите поток для обработки вызовов accept() в сокете сервера и затем создаете новый поток для обработки вызовов на Socket, который он возвращает. Если вы это сделаете, вам необходимо убедиться, что вы изолируете код для каждого сокета как можно больше. Нить accept будет циклически навечно или до тех пор, пока не будет установлен флаг, и просто вызовет accept, создаст поток с новым сокетом и вернется к вызову accept. Вся работа выполняется в дочернем потоке.

  2. Используйте NIO или другую технологию для работы с несколькими плексами в еще один поток. NIO использует концепцию, иногда называемую select, где ваш код будет вызываться, когда есть вход, доступный из определенного сокета.

Если вы просто делаете небольшой сервер, вы можете пойти с простой конструкцией, а также не будет иметь слишком много клиентов, так что я бы с # 1. Если вы занимаетесь крупным производственным сервером, я бы рассмотрел структуру, такую ​​как netty или jetty, которая поможет вам сделать # 2. NIO может быть сложным.

В любом случае, будьте очень осторожны с потоками и файловой системой, вы можете не получить ожидаемые результаты, если вы не используете блокировку из пакета параллелизма или синхронизируете или другую схему блокировки.

Мой последний совет, будьте осторожны с тем, чтобы клиент сказал серверу что-либо сделать с файловой системой. Просто сказать, что это опасная вещь, чтобы сделать ;-)

1

Вашего класса сервер должен использовать несколько потоков для обработки всех соединений:

class MyServer { 


    private ServerSocket servsock; 

    MyServer(){ 
     servsock = new ServerSocket(PORT_NUMBER); 
    } 

    public void waitForConnection(){ 
     while(true){ 
      Socket socket = servsock.accept(); 
      doService(socket); 
     } 
    } 

    private void doService(Socket socket){ 
     Thread t = new Thread(new Runnable(){ 
      public void run(){ 
       while(!socket.isClosed()){ 
        Scanner in = new Scanner(sock.getInputStream()); 
        PrintWriter out = new PrintWriter(sock.getOutputStream()); 
        String request = ""; 
        // and write your code 
       } 
      } 
     }); 
     t.start(); 
    } 
} 
+0

Плохая практика, вы создаете новый «Scanner» и «PrintWriter» для каждого цикла, два объявления должны выйти за пределы цикла. – BackSlash

+0

да. это верно. Я копирую и вставляю эти строки из кода user2565623 без внимания! :( – Vahid

+0

Он по-прежнему не работает с несколькими клиентами, которые будут подключаться одновременно на одном сервере. Но когда первый клиент покинет соединение, будет подключен другой клиент. Это похоже на метод First come first serve. Any предложения пожалуйста :) – InformationTechnology

Смежные вопросы