У меня вопрос, я сейчас работаю над небольшим проектом и наткнулся на тупик.У меня есть сервер 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 находится на другом порту.Я делаю это неправильно?