2014-01-04 6 views
1

Server.java:Многопоточный сервер Java Socket; Болтаем

private Socket connection; 
    private int ID; 

    public static void main(String[] args) { 
    int port = 19999; 
    int count = 0; 
    try{ 
     ServerSocket socket1 = new ServerSocket(port); 

     System.out.println("Server Initialized"); 
     while (true) { 
     Socket connection = socket1.accept(); 
     Runnable runnable = new Server(connection, ++count); 
     Thread thread = new Thread(runnable); 
     thread.start(); 
     } 
    } 
    catch (Exception e) {} 
    } 
Server(Socket s, int i) { 
    this.connection = s; 
    this.ID = i;//could use a client name as it is individual id for each thread.? 
} 
public void run() { 
    try { 
     BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     PrintWriter out = new PrintWriter(connection.getOutputStream(), true); 

     String inputLine; 
      while ((inputLine = in.readLine()) != null) { 
       Process p = new Process(); 
       String output = p.input(inputLine); 
       out.println(output); 
       } 
      } 
    } 
    catch (Exception e) { 
     System.out.println(e); 
    } 
    finally { 
     try { 
     connection.close(); 
    } 
     catch (IOException e){} 
    } 
} 
} 

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

Однако код:

while ((inputLine = in.readLine()) != null) { 
        Process p = new Process(); 
        String output = p.input(inputLine); 
        out.println(output); 
        } 

петли на BufferedReader, чтобы получить все входные заданный от клиента. и когда он принимает процессы, а затем отправляет ответ обратно клиенту для печати.

Как я могу получить его, чтобы я мог отправить/получить другой вопрос через клиента одновременно с первым?

например

"пользователь: привет компьютер, как вы" "компьютер: Я хорош, как дела?" «пользователь: я хороший» «компьютер: это приятно слышать»

работает нормально. но:

"пользователь: was is 1 + 1?" "компьютер: 1 + 1 = 2" "компьютер: больше вопросов?" "Пользователь: хорошо?"

нет.

как это сделать, чтобы сервер дал несколько ответов, вместо того, чтобы ждать другого ввода?

Было бы легко сделать, если я установить результат в виде строки в Server.java однако каждый раз, когда я пытаюсь получить доступ к строке, чтобы изменить его (с помощью
Server s = new Server(); s.output = "stuff";), как код предполагает, что это просто делает новый сервер нитей. как я могу получить доступ к уже созданному потоку?

ответ

0

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

+0

кажется хорошей идеей, но доступ к карте в классе сервера создаст новый поток – Greg

+0

Не обязательно новый поток. Вы можете использовать существующий клиентский поток для доступа к карте. Сама карта может быть расположена в основном потоке сервера. – Wins

+0

Как я могу это сделать? – Greg

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