2013-05-22 2 views
0

내 서버는 스레드에서이 코드를 실행하므로 클라이언트가 연결되기를 기다리는 동안 GUI와 상호 작용할 수 있습니다. (현재 클라이언트와 서버는 각각 1 개만 사용하고 있습니다.)서버 클라이언트 응용 프로그램에 대한 StreamCorruptedException

@Override 
public void run() { 

    Socket client = null; 
    MessageListener listener = null; 

    try { 
     client = server.accept(); 
     oos = new ObjectOutputStream(client.getOutputStream()); 
     ois = new ObjectInputStream(client.getInputStream()); 
     listener = new MessageListener(ois); 
     (new Thread(listener)).start(); 

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

내 고객은 입력/출력 스트림을 서버에 연결하여 해결하기 위해 한 번이 코드를 실행합니다

try { 
     ois = new ObjectInputStream(server.getInputStream()); 
     MessageListener listener = new MessageListener(ois); 
     oos = new ObjectOutputStream(server.getOutputStream()); 
     (new Thread(listener)).start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

MessageListener를 메시지를 incomming 확인하기 위해 스레드를 실행합니다.

@Override 
public void run() { 
    while (true) { 
     Message message = null; 
     try { 
      message = (Message) in.readObject(); 
      if (message != null) { 
       System.out.println(message.getName()); 
      } 
     } catch (ClassNotFoundException | IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

그러나, 나는 내 프로그램을 시작할 때, 처음에 난 단지 서버에서 클라이언트로 보낼 수 있으며, 다른 방법은 주위에 (난 그냥 클라이언트 GUI와 상호 작용할 수 없습니다). 나는 다음과 같은 오류 메시지가 나타납니다 서버에서 클라이언트로 첫 번째 메시지를 전송하면 :

java.io.StreamCorruptedException: invalid type code: 6F 
at java.io.ObjectInputStream.readObject0(Unknown Source) 
at java.io.ObjectInputStream.readObject(Unknown Source) 
at com.jale.chat.iohandling.MessageListener.run(MessageListener.java:25) 
at java.lang.Thread.run(Unknown Source) 

편집 : 나는 첫 번째 오류 메시지가받은 후에, 나는 단지 실제로 전송 (클라이언트에서 서버로 보낼 수 있습니다 작품)하지만 오류 메시지가 내 콘솔을 계속 스팸.

라인 MessageListener를 25 :

message = (Message) in.readObject(); 

는 일반적인 문제로, 구글/스택 오버플로 아무것도 발견하지 않았습니다 때 점점 StreamCorruptedException가 될 것으로 보인다 때 사람들이 여러 개 열려 InputStreams 또는 단일 소켓에 대한 OutputStreams, 그러나 나는 그렇게하지 않는다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

1

입력/출력 스트림을 두 번 이상 열었을 수도 있습니다. connect-Function이 한 번만 호출되는지 확인하십시오.

-1

흠, 클라이언트/서버 쪽 모두에 동일한 클래스 (ID 포함)를 사용해야합니다. 내 메시지 메커니즘을 클라이언트/서버 프로젝트에서 모두 사용되는 라이브러리에 넣었습니다. 게다가 서버/클라이언트를 컴파일하면 세 가지 프로젝트가 모두 컴파일됩니다. 아마도 도움이 될 것입니다.

+0

필자는 서버 또는 클라이언트로 시작하기 위해 시작한 프로젝트를 하나만 선택 했으므로 실제로는 그렇지 않습니다. 게다가, 나는 간단한 문자열을 보낼 때 같은 문제가있다. –

+0

이것은 'serialVersionUID' 문제가 아닙니다. 그게 당신이 모호하게 말하는 것이라면. – EJP

1

ObjectOutputStreams을 구성하고 멀리 던지고 있습니다. 그것들은 ObjectInputStreams,처럼 MessageListener의 생성자로 전달되어야하므로 클라이언트마다 쓸만한 뭔가가 있습니다. 코드가 지금과 같은 방식으로 피어에 올바르게 쓸 수는 없습니다. 아마도 어딘가에서 잘못된 피어에 대해 ObjectOutputStream을 재사용하고있을 것입니다.

생성하려는 변수는 주변 클래스의 멤버가 아니라 메서드에 로컬이어야합니다. 사실 두 스트림은 시작하려고하는 스레드의 run() 메서드에서 구현해야하며 accept() 루프에서는 인라인이 아닙니다. 그렇지 않으면 잘못된 장소에서 차단 될 위험이 있습니다. 그리고 ObjectOutputStream은 교착 상태를 불가능하게하기 위해 항상 ObjectInputStream 앞에 만들어야합니다.

관련 문제