2009-09-17 7 views
1

여러 클라이언트를 지원할 수있는 Java에서 서버 클라이언트 소켓 프로그램을 구현하려고하지만 클라이언트가 서버에 연결할 때마다 멀티 스레딩을 수행하는 클래스가 항상 충돌합니다.Java의 멀티 스레드 채팅 서버

import java.io.*; 
import java.net.*; 
public class ClientWorker extends Thread{ 
    Socket cwsocket=null; 

    public ClientWorker(Socket cwsocket){ 
     super("ClientWorker"); 
     cwsocket=cwsocket; 
    } 

    public void run(){ 
     try { 
      PrintWriter out = new PrintWriter(cwsocket.getOutputStream(), true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(cwsocket.getInputStream())); 

      String serverinput, serveroutput=""; 

      out.println(serveroutput); 

      while ((serverinput = in.readLine()) != null) { 
       out.println(serveroutput); 
       if (serveroutput.equals("Terminate")) 
        break; 
      } 
      out.close(); 
      in.close(); 
      cwsocket.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

PrintWriter 개체를 만들 때마다 NullPointerException 예외가 throw되고 그 이유가 확실하지 않습니다. 아래는 내 서버 및 클라이언트 클래스입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

import java.io.*; 
import java.net.*; 
public class Server { 

    public static void main(String[]args)throws IOException{ 
     ServerSocket serversocket=null; 
     final int PORT_NUM=4444; 
     boolean flag=true; 
     try{ 
      System.out.println("Listening for connection"); 
      serversocket=new ServerSocket(PORT_NUM); 
     }catch(IOException e){ 
      System.out.println("Could not listen to port: "+PORT_NUM); 
      System.exit(-1);  
     } 
     while(flag){ 
      new ClientWorker(serversocket.accept()).start(); 
     } 
     System.out.println("Terminating server..."); 
     serversocket.close(); 
    } 
} 

import java.io.*; 
import java.net.*; 
public class Client { 

    public static void main(String[] args){ 
     Socket socket=null; 
     PrintWriter out=null; 
     BufferedReader in=null; 
     BufferedReader userInputStream=null; 
     String IP="127.0.0.1"; 
     try{ 
      socket = new Socket(IP, 4444); 
      out = new PrintWriter(socket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     } catch (UnknownHostException e) { 
      System.out.println("Unknown host:" + IP); 
      System.exit(1); 
     } catch (IOException e) { 
      System.out.println("Cannot connect to server..."); 
      System.exit(1); 
     } 
     String userInput, fromServer; 
     try{   
      userInputStream = new BufferedReader(new InputStreamReader(System.in)); 
      while ((fromServer = in.readLine()) != null) { 
       System.out.println("Server: " + fromServer); 
       if (fromServer.equals("Terminate")) 
        break; 

       userInput = userInputStream.readLine(); 
       if (userInput != null) { 
         System.out.println("> " + userInput); 
         out.println(userInput); 
       } 
      } 
     }catch(IOException e){ 
      System.out.println("Bad I/O"); 
      System.exit(1); 
     } 
     try{ 
      out.close(); 
      in.close(); 
      userInputStream.close(); 
      socket.close(); 
      System.out.println("Terminating client..."); 
     }catch(IOException e){ 
      System.out.println("Bad I/O"); 
      System.exit(1); 
     }catch(Exception e){ 
      System.out.println("Bad I/O"); 
      System.exit(1); 
     } 
    } 
} 

답변

9

public ClientWorker(Socket cwsocket){ 
     super("ClientWorker"); 
     cwsocket=cwsocket; 
    } 

에서 당신은 같은 이름의 멤버 그림자하지 않도록

 this.cwsocket=cwsocket; 

을하거나 매개 변수의 이름을 변경해야합니다.

+2

문제가있는 것 같습니다. 이러한 쓸모없는 과제 (예 : Eclipse)에 대해 경고하는 IDE를 사용하는 것이 좋습니다. – abyx

+0

좋은 캐치. +1 –

+1

Doh! 나는 '이'키워드를 잊어 버린 것을 믿을 수 없다. 정말로 좋은 캐치! – GobiasKoffi