2012-05-14 4 views
0

сервера Код:StreamCorruptedException: неверный код типа: 00

while (true) {         
    Socket sock = serv.accept(); 
    try { 
     new ClientSession(sock, outQueue, activeSessions); 
     System.out.println("CS"); 
    } catch (IOException e) { 
     System.out.println("Sock error"); 
     sock.close(); 
    } 
} 

ClientSession:

class ClientSession extends Thread { 
private Socket socket; 
private OutboundMessages outQueue; 
private ActiveSessions activeSessions; 
private ObjectInputStream netIn; 
private ObjectOutputStream netOut; 
int n = 0; 
boolean inGame = false; 
boolean ready = false; 
Player p; 

public ClientSession(Socket s, OutboundMessages out, ActiveSessions as) 
     throws IOException { 
    socket = s; 
    outQueue = out; 
    activeSessions = as; 
    netOut = new ObjectOutputStream(socket.getOutputStream()); 
    netOut.flush(); 
    netIn = new ObjectInputStream(socket.getInputStream()); 
    System.out.println("ClientSession " + this + " starts..."); 
    while (true) { 
     Object nameMsg = null; 
     try { 
      nameMsg = netIn.readObject(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
     if (nameMsg instanceof NameMessage) { 
      this.setName(((NameMessage) nameMsg).name); 
      break; 
     } 
    } 
    start(); 
} 

public void run() { 
    try { 
     activeSessions.addSession(this); 
     while (true) { 
      Object inMsg = null; 
      try { 
       try { 
        inMsg = netIn.readObject(); 
       } catch (ClassNotFoundException e) { 
        e.printStackTrace(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      if (inMsg instanceof ReadyMessage) { 
       ready = true; 
      } else if (inMsg instanceof DirMessage) { 
       p.setDir(((DirMessage)inMsg).dir); 
      } 

     } 
    } finally { 
     try { 
      socket.close(); 
     } catch (IOException e) { 
     } 
    } 
} 

public void sendMessage(Message msg) { 
    try { 
     if (!socket.isClosed()) { 
      netOut.writeObject(msg); 
      netOut.flush(); 
     } else { 
      throw new IOException(); 
     } 
    } catch (IOException eee) { 
     try { 
      socket.close(); 
     } catch (IOException ee) { 
     } 
    } 
} 

Создание ввода и вывода на стороне клиента:

public void connect() { 
    try { 
     InetAddress serverAddr = InetAddress.getByName(serverName); 
     try { 
      System.out.println("Connecting with " 
        + serverAddr.getHostName() + ":" + port); 
      socket = new Socket(serverAddr, port); 

      try { 
       System.out.println("Connected to " 
         + serverAddr.getHostName()); 
       netOut = new ObjectOutputStream(socket.getOutputStream()); 
       netOut.flush(); 
       netIn = new ObjectInputStream(socket.getInputStream()); 
       netOut.writeObject(new NameMessage(name)); 
       netOut.flush(); 
      } finally { 

      } 

     } catch (ConnectException e) { 
      System.out.println("Cannot connect to server"); 

     } catch (IOException e) { 
      System.out.println("Input error"); 
     } 

    } catch (UnknownHostException e) { 
     System.out.println("Unknown server: " + e.getMessage()); 
    } 
} 

приемник на стороне клиента:

public void run() { 
    while (true) { 
     Object a = null; 

      try { 
       a = netIn.readObject(); 
       netIn.reset(); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     if (a != null && a instanceof CoordMessage) { 
      setXY((CoordMessage)a); 
     } 
    } 
} 

StackTrace:

java.io.StreamCorruptedException: invalid type code: 00 
at java.io.ObjectInputStream.readObject0(Unknown Source) 
at java.io.ObjectInputStream.readObject(Unknown Source) 
at twoPlayerClient.Receiver.run(Receiver.java:28) 

После создания входных и выходных я постоянно передавая их другим классам, а не создавать новые.

Я прочитал другие подобные вопросы, но не могу найти ответ на вопрос, почему это происходит.

+0

См. Http://stackoverflow.com/questions/9217010/serialisation-in-java-invalid-type-code-00 и http://stackoverflow.com/questions/2234406/exception-java-io-streamcorruptedexception- invalid-type-code-00 – skaffman

+0

И не как OT, как может показаться, вы не должны делать ни одного из этих операций ввода-вывода, включая создание потоков, в конструкторе 'ClientSession'. Вы должны сделать все это в методе run(). В противном случае вы блокируете цикл accept(), что отрицательно сказывается на других клиентах. – EJP

+1

Там, кажется, есть несколько ложных вызовов метода. 'reset' не поддерживается' ObjectInputStream'. Не нужно «смывать» непосредственно после создания потока (хотя это не должно * нанести какой-либо вред). Помимо этого я предлагаю модульное тестирование (и улучшая качество кода, чтобы его можно было тестировать в блоке). –

ответ

-1
new ClientSession(sock, outQueue, activeSessions); 

Я думаю, что для каждого клиента существует новый сеанс, поэтому вы не можете использовать переменную потока с глобальной областью. Поскольку он также используется другими потоками сеанса.

+0

-1. * Что * переменная потока? – EJP

Смежные вопросы