Java多线程服务器客户端

时间:2012-02-10 12:05:24

标签: java multithreading networking client

我有一个问题,我正在研究我的一个小项目,偶然发现了一个死胡同。我有一个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 个答案:

答案 0 :(得分:2)

您正在拨打accept()两次。只需将其调用一次,然后将生成的Socket存储在一个变量中,然后您可以将其移交给new ClientHandler()

哦,同样,Socket知道通信的两面,所以不会被客户端使用的任何端口混淆。