2014-12-31 3 views
1

여러 클라이언트가 서버에 연결할 수있는 Java 클라이언트 - 서버 응용 프로그램을 개발하려고합니다. 들어오는 각 클라이언트에 대해 별도의 스레드를 시작하고 클라이언트 소켓을 스레드에 전달한 다음 스트림을 열어 통신을 유지합니다. 그리고 java.io.StreamCorruptedException - 잘못된 코드 유형 AC가 있습니다.스트림 손상 예외 - 잘못된 코드 유형 AC [java]

내가 조사한 바에 따르면, 새로운 ObjectOutputStream을 사용하여 기존 ObjectInputStream에 쓰는 것을 의미합니다. 그러나, 나는이 코드를 어떻게 다루어야하는지 잘 모르겠다. 스트림 초기화를 위해 여러 곳을 시도했지만 여전히 제대로하지 못했다. 예외가 발생하는 행은 클라이언트 코드에 표시됩니다. IO 스트림에 대한 기본적인 이해가 부족합니다. 여기 내 서버 코드는 스레드가 클라이언트 연결 실행과 함께,이다 :

public class Server { 

public static void main(String[] args) throws IOException { 

     ServerSocket serverSocket = null; 

     boolean listeningSocket = true; 
     try { 
      serverSocket = new ServerSocket(11111); 
     } catch (IOException e) { 
      System.err.println("Could not listen on port: 11111"); 
     } 

     while(listeningSocket){ 
      System.out.println("Waiting for a client to connect..."); 
      Socket clientSocket = serverSocket.accept(); 
      System.out.println("Client connected!"); 
      ConnectThread ct = new ConnectThread(clientSocket); 
      ct.start(); 
      ct.run(); 
     } 
     serverSocket.close();  
    } 

을}

연결 스레드 :

public class ConnectThread extends Thread{ 

private Socket socket = null; 


public ConnectThread(Socket socket) { 

    super("ConnectThread"); 
    this.socket = socket; 

} 

@Override 
public void run(){ 
    ObjectOutputStream serverOutputStream = null; 
    ObjectInputStream serverInputStream = null; 
    try { 
     System.out.println("check"); 
     serverOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
     System.out.println("check"); 
     serverInputStream = new ObjectInputStream(socket.getInputStream()); 
     serverOutputStream.writeInt(42); 
     System.out.println("check"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    finally{ 
     try { 
      serverOutputStream.close(); 
      serverInputStream.close();    
      socket.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 
     //implement your methods here 

}

와 클라이언트 :

public class Client { 

public static void main(String[] arg) { 


    Socket socketConnection = null; 
    ObjectOutputStream clientOutputStream = null; 
    ObjectInputStream clientInputStream = null; 
      try { 

     socketConnection = new Socket("127.0.0.1", 11111); 

     clientOutputStream = new ObjectOutputStream(
       socketConnection.getOutputStream()); 
     clientInputStream = new ObjectInputStream(
       socketConnection.getInputStream()); 
     System.out.println("check"); 
     System.out.println(clientInputStream.readInt()); // HERE'S WHERE THE EXCEPTION OCCURS 

    } catch (Exception e) { 
     System.out.println("The following exception has occured and was caught:"); 
     System.out.println(e); 
    } 

    finally{ 
     try { 
      clientOutputStream.close(); 
      clientInputStream.close(); 
      socketConnection.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

} 먼저이 비트를 수정해야

답변

1

:

 ConnectThread ct = new ConnectThread(clientSocket); 
     ct.start(); 
     ct.run(); 

귀하의 ConnectThread이 서브 클래스의 경우 스레드이며, 당신이 시작을 전화 한 번 실행 방법을 실행하기 위해 새로운 스레드를 시작합니다. 따라서 ct.run()을 삭제하십시오; 다시 확인하십시오. 대부분의 경우 동일한 소켓에서 두 개의 스레드 (하나만 수락하고 하나만 연결)에서 읽으려고하면 오류가 발생합니다.

관련 문제