2014-12-27 4 views
0

У меня небольшая проблема с моим клиент-серверным приложением. Когда я хочу подключить более одного клиента и отправить smth, или я сделаю выход из системы в своем Клиенте и попытаюсь подключиться еще раз, я получил исключение: «java.io.StreamCorruptedException: недопустимый код типа: 04»java.io.StreamCorruptedException: недопустимый код типа: 04

Что проблема? Спасибо за помощь.

код сервера:

class ClientCommunication implements Runnable { 
    private Socket incoming; 

    public ClientCommunication(Socket clientSocket) { 
     incoming = clientSocket; 
    } 

    public void run() { 
     try { 
      synchronized (this) {          
        serverObjectOutput = new ObjectOutputStream(
          incoming.getOutputStream()); 
        serverObjectInput = new ObjectInputStream(
          incoming.getInputStream());      
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     int operation = -1; 
     synchronized(this) { 
      while (true) { 
       try{       
        if(serverObjectInput.available() > 0){ 
        operation = serverObjectInput.readInt(); 

        switch(operation) { 
        case 1: 
          Employee employee = (Employee) serverObjectInput.readObject(); 
          //CHECK LOGGING DATA 
          // SEND RESULT = 1 OR RESULT = -1 
          break; 
       } 
       } 
      } catch(IOException | ClassNotFoundException | SQLException ex)     
      { 
       ex.printStackTrace(); 
      }     
      } 
     }   
    } 
} 


class ServerStart implements Runnable { 
    private int portNumber; 

    public ServerStart(int portNumber) { 
     this.portNumber = portNumber; 
    } 

    public void run() { 

     try { 
      conn = getConnection(); 
      stat = conn.createStatement(); 

     } catch (SQLException e1) {    
      e1.printStackTrace(); 
     } catch (IOException e1) {    
      e1.printStackTrace(); 
     } catch (InterruptedException e) {    
      e.printStackTrace(); 
     } 

     try { 
      serverSocket = new ServerSocket(portNumber);   

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

     try { 
      while (true) { 
       Socket incoming = serverSocket.accept(); 

       Runnable r = new ClientCommunication(incoming); 
       Thread t = new Thread(r); 
       t.start(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Client Функция:

  public void actionPerformed(ActionEvent e) { 
       if (isConnected == false) { 
        String ServerIP = ip.getText().trim(); 

        int ServerPort = Integer 
          .parseInt(port.getText().trim()); 


        try { 
         ClientSocket = new Socket(ServerIP, ServerPort);       

         clientObjectInput = new ObjectInputStream(
           ClientSocket.getInputStream()); 
         clientObjectOutput = new ObjectOutputStream(
           ClientSocket.getOutputStream()); 

         isConnected = true; 
        } catch (IOException ex) { 
         ex.printStackTrace(); 
        } 
        synchronized (this) { 
         try {        
          ClientLoginFrame login = new ClientLoginFrame(); 

          Employee employee = login.getEmployee();                 
          clientObjectOutput.writeInt(1); 
          clientObjectOutput.flush(); 
          clientObjectOutput.writeObject(employee);        
          int result = clientObjectInput.readInt(); 

          if(result == 1) 
          {       
          // DO SMTH 
          } 
          else { 
           isConnected = false; 
           ClientSocket.close();         
          }       
         } catch (IOException ex) { 
          ex.printStackTrace();  
         } 
        } 
       } 
      } 
     }); 
+0

Почему вы заняты ожиданием данных, когда вы можете использовать блокировку прочитайте, что было бы намного проще. Кроме того, флеш, прежде чем вы пишете объект, ничего не сделает, может быть полезнее флеш и возможный 'reset()' после того, как вы напишете объект. –

+0

Когда вы получите исключение, я бы не притворился, что этого не произошло, и просто продолжайте. Вам нужно поставить try/catch вокруг всего и закрыть соединение. –

+0

Я предлагаю отделить классы графического интерфейса и сети, а также изолировать сетевые классы. –

ответ

0

Я подозреваю, что Ваша проблема заключается в том, что вы делите одиночек serverInputStream и serverOutputStream между соединениями. Это не проблема, пока у вас не будет более одного, когда точка с одним потоком в нескольких потоках сразу развращает поток (или делает чтение недопустимым)

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