Клиент многопоточного сервера Java - PullRequest
1 голос
/ 10 февраля 2012

У меня вопрос, я сейчас работаю над небольшим проектом и наткнулся на тупик.У меня есть сервер Java:

import java.io.*;
import java.net.*;

class TCPServer
{
public static void main(String argv[]) throws Exception
{
ServerSocket welcomeSocket = new ServerSocket(3443);
Socket clientSocket =null;
ClientHandler ch;
while(true)
{
  try{
  clientSocket = welcomeSocket.accept();
  System.out.println("Client connected on port :"+clientSocket.getPort());
  ch = new ClientHandler (clientSocket);
  Thread t = new Thread(ch);
  t.start();
  }catch (Exception e){
    System.out.println("SERVER CRASH");
}
}
}
}

Затем клиент подключается через порт 3443, новый поток создается с ClientHandler.Теперь проблема в том, что на стороне клиента сокет, используемый для подключения, все еще находится на порту 3443, но на стороне сервера поток находится на произвольном порту, скажем, 5433, поэтому сервер может взаимодействовать с потоком, но не с клиентом,потому что он не знает, какой порт использует поток ... Я немного запутался со всем этим, нужен ли клиентский класс только для установления начального соединения, тогда вся связь осуществляется через класс ClientHandler, еслипоэтому я должен также создать экземпляр объекта ClientHandler в классе клиента?

Вот мой класс клиента:

import java.io.*;
import java.net.*;

class TCPClient
{ 

 static Socket clientSocket = null;

 public static void main(String argv[]) throws Exception
 {
  BufferedReader k = new BufferedReader(new InputStreamReader(System.in));
  BufferedReader ine = null;
  DataOutputStream oute = null;
try{
  clientSocket = new Socket("localhost", 3443);
  oute = new DataOutputStream(clientSocket.getOutputStream());
  ine = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
} catch (UnknownHostException e) {
  System.out.println("Unknown host");
  System.exit(1);
} catch  (IOException e) {
  System.out.println("No I/O");
  System.exit(1);
}



try{
  //send
  oute.writeBytes(k.readLine());
  //recieve
  String line = ine.readLine();
  System.out.println("Text received: " + line);

} catch (IOException e){
  System.out.println("Read failed");
  System.exit(1);
}

}
} 

Проблема в том, что сокет, созданный в клиенте, все еще подключен к порту 3443, и сервер прослушивает этот порт, поэтому я не получучто-нибудь с сервера (бесконечный цикл).ClientHandler находится на другом порту.Я делаю это неправильно?

1 Ответ

2 голосов
/ 10 февраля 2012

Вы звоните accept() дважды.Вызовите его только один раз и сохраните результирующую Socket в переменной, которую затем можете передать new ClientHandler().

О, кроме того, Socket знает обе стороны сообщения, поэтому оно не будетбыть сбитым с толку любым портом, который использует клиент.

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