2012-02-10 3 views
0

질문이 있습니다. 현재 약간의 프로젝트를 진행 중이고 막 다른 골목을 발견했습니다. Java Mulithreaded Server 클라이언트

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"); 
} 
} 
} 
} 

그런 다음 클라이언트가 새 스레드는 ClientHandler에 만들어집니다 포트 3443를 통해 연결 : 나는 자바 서버가 있습니다. 지금 문제는 클라이언트 쪽에서 연결에 사용 된 소켓이 여전히 포트 3443에 있지만 서버 쪽에서 스레드가 임의의 포트에 있다고 가정 해 봅시다. 서버가 스레드와 통신 할 수 있지만 클라이언트와 통신 할 수는 없습니다. 쓰레드가 어떤 포트를 사용하고 있는지 알지 못하기 때문에 ... 나는이 모든 것들과 혼동 스럽다. 클라이언트 클래스는 초기 연결 만 할 필요가있다. 그러면 모든 통신은 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

+0

예; 'accept()'가 다시 호출 될 때까지 추가 클라이언트가 연결할 수 없으므로'ServerSocket.accept()'를 호출하는 스레드는 가능한 빨리 수신 연결을 포기해야합니다. – Bombe