2012-02-10 258 views
0

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

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

另外,Socket也知道通信的两端,因此不会被客户端使用的任何端口所迷惑。

+0

所以通信只能在clientHandler中进行吗? – Wilsane 2012-02-10 12:16:25

+0

是的;调用'ServerSocket.accept()'的线程应尽可能快地放弃传入连接,因为直到再次调用accept()时,其他客户端才能连接。 – Bombe 2012-02-10 12:18:54