2012-05-07 3 views
1

Ну, я пытаюсь прочитать XML-файл XML. читать XML-файлы и распечатать его от сервера к клиенту, но при запуске клиентского кода я получаю:«java.io.StreamCorruptedException: недопустимый код типа: AC» - Ошибка при запуске кода клиента из программы-сервера-клиента java

java.io.StreamCorruptedException: invalid type code: AC 

код Клиент:

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.List; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 

import server.Video; 
import server.VideoFile; 

@SuppressWarnings("serial") 
public class Client extends JFrame{ 
    Container contentPane; 
    @SuppressWarnings("rawtypes") 
    JComboBox selectionBox; 

    List<Video> video; 
    List<VideoFile> videoFile; 

    Socket serverSocket; 
    String host = "127.0.0.1"; 
    int port = 1176; 
    ObjectInputStream inputFromServer; 
    ObjectOutputStream out; 

    public Client() throws Exception { 
     // line 41 below 
      setupGUI(); 

     System.out.println("Reading the XML File"); 
     MyXMLReader reader = new MyXMLReader(); 
     //video = reader.getList("videoList.xml"); 
     System.out.println("Finished reading"); 
    } 

    public void openSocket() throws UnknownHostException, IOException { 
     /** Obtain an address object of the server */ 
     serverSocket = new Socket("localhost", port); 
     System.out.println("Connected to localhost in port: " + port); 
     out = new ObjectOutputStream(serverSocket.getOutputStream()); 
     //out.flush(); 
     inputFromServer = new ObjectInputStream(serverSocket.getInputStream()); 

    } 

    @SuppressWarnings("unchecked") 
    public void getListFromSocket() throws IOException, ClassNotFoundException { 
     try{ 
     video = (List<Video>)inputFromServer.readObject(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 
     //serverSocket.close(); 
    } 
    public void runClient() throws Exception { 

      try { 
       openSocket(); 
       getListFromSocket(); 
       serverSocket.close(); 
       setupGUI(); 
       } catch (UnknownHostException e) { 
       System.out.println("Don't know about host : " + host); 
       System.exit(-1); 
       } catch (IOException e) { 
       e.printStackTrace(); 
       System.out.println("Couldn't open I/O connection : " + host + ":" + port); 
       System.exit(-1); 
       } catch (ClassNotFoundException e) { 
       System.out.println("Class definition not found for incoming object."); 
       e.printStackTrace(); 
       System.exit(-1); 
      } 

    } 

    @SuppressWarnings({ "unchecked", "rawtypes" }) 
    private void setupGUI() throws Exception{ 
     setTitle("A Client"); 
     setSize(600, 400); 
     setVisible(true); 
     contentPane = getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 

      runClient(); 

     // line 105 below 
     String [] selectionListData = new String[video.size()]; 
     for (int i = 0; i < video.size(); i++) { 
     selectionListData[i] = video.get(i).getFilename(); 
     selectionListData[i] = video.get(i).getID(); 
     selectionListData[i] = video.get(i).getTitle(); 
     System.out.println(selectionListData); 
     } 
     selectionBox = new JComboBox(selectionListData); 
     selectionBox.setSelectedIndex(0); 
     add(selectionBox, BorderLayout.NORTH); 
     selectionBox.addActionListener((ActionListener) this); 

     validate(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     @SuppressWarnings("rawtypes") 
     JComboBox comboBox = (JComboBox)e.getSource(); 
     String selectedTitle = (String)comboBox.getSelectedItem(); 
     System.out.println("Selected title : " + selectedTitle); 
     } 


    public static void main(String[] args) throws IOException, Exception { 
      // line 127 below 
     new Client(); 

    } 

} 

полная ошибка:

Connected to localhost in port: 1176 
    java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at client.Client.getListFromSocket(Client.java:61) 
    at client.Client.runClient(Client.java:72) 
    at client.Client.<init>(Client.java:40) 
    at client.Client.main(Client.java:124) 

Может кто-нибудь исправить это, я уверен, что это что-то маленькое, но я не могу понять это.

Благодаря

EDIT: Код сервера:

package server; 

import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.List; 
import java.lang.*; 

@SuppressWarnings("unused") 
public class Server extends Thread implements Runnable{ 
    List<Video> video; 
    static String TimeStamp; 
    //Socket Declerations 
    ServerSocket serverSocket; 
    int port = 1176; 
    //String host = "localhost"; 
    Socket clientSocket; 
    ObjectOutputStream outputToClient; 



    public Server() { 
     Thread(); 
     System.out.println("Reading the XML File"); 
     MyXMLReader reader = new MyXMLReader(); 
     //video = reader.getList("videoList.xml"); 
     System.out.println("Finished reading"); 
    } 

    public void openSockets() throws IOException { 
     try { 
      serverSocket = new ServerSocket(port); 
      System.out.println("Socket Connection Established...."); 
     } catch (IOException e) { 
      System.out.println("Could not listen on port : " + port); 
      System.exit(-1); 
     } 
     TimeStamp = new java.util.Date().toString(); 
     System.out.println("Opened socket on : " + port + ", waiting for client. " + TimeStamp); 

     try { 
      clientSocket = serverSocket.accept(); 
      //System.out.println("Sending to Client....."); 
      } catch (IOException e) { 
      System.out.println("Could not accept client."); 
      System.exit(-1); 
      } 
      outputToClient = new ObjectOutputStream(clientSocket.getOutputStream()); 
    } 
    public void writeToSocket() throws IOException { 
     outputToClient = new ObjectOutputStream(clientSocket.getOutputStream()); 
     outputToClient.writeObject(video); 
     System.out.println(outputToClient); 
    } 

    public void Thread() { 
     Thread socketThread; 
     socketThread = new Thread("Socket") { 
     public void run() { 
      try { 
       openSockets(); 
       writeToSocket(); 
       clientSocket.close(); 
       serverSocket.close(); 
      } catch (IOException e) { 
       System.out.println("Error on sockets connection."); 
       e.printStackTrace(); 
      } 
     } 
}; 
socketThread.start(); 
} 

    public static void main(String[] args) throws IOException { 
     new Server(); 
     //new Thread(); 


    } 

} 

EDIT: Новая ошибка после удаления дубликатов записи:

Exception in thread "main" java.lang.NullPointerException 
    at client.Client.setupGUI(Client.java:105) 
    at client.Client.<init>(Client.java:41) 
    at client.Client.main(Client.java:127) 
+0

Возможно, проблема на сервере. Можете ли вы опубликовать свой код? – Krrose27

+0

Я только что добавил код сервера выше. –

+0

В клиенте вы можете добавить комментарий к строкам 105, 41 и 127? Когда я бросаю его в то, что имеет номера строк, ничто не сравнится с тем, что может вызвать нулевой указатель. – Krrose27

ответ

2

Вы находитесь двойное открытие ObjectOutputStream на том же сокете в классе Server, который выдает два специальных заголовка.

1: openSockets последняя линия outputToClient = new ObjectOutputStream(clientSocket.getOutputStream());

2: writeToSocket первая линия outputToClient = new ObjectOutputStream(clientSocket.getOutputStream());

Снимите в зависимости от того, который вы хотите, и он должен работать нормально.

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

+0

О! Спасибо, что указали это. Появилась новая проблема/ошибка. При запуске клиента отображается следующая ошибка. Я добавил в вопрос выше. Я думаю, что он не умеет читать файл, но когда я запускаю XML-парсер в клиентском коде, выполняется XML-анализ, но в «String [] selectionListData = new String [video.size()]; его не удалось получить его размер –

+0

@AtifS. Таким образом, вы отменяете нулевую ссылочную переменную в строке 105 MEMEClient.java. Поскольку вы не разместили этот код, никто не сможет вам помочь. Вы должны иметь возможность самостоятельно сортировать NPE, но если нет, вам нужно будет опубликовать его и связанный с ним код в качестве нового вопроса. – EJP

+0

Он не может «удалить какой бы то ни было». Он * должен * удалить объект в методе 'writeToSocket()' и сохранить его в переменной-члене. В противном случае он все равно получит новую OOS для записи и все еще будет иметь ту же проблему. – EJP

1

Эта ошибка вызвана использованием более одного ObjectOutputStream в том же гнезде. Используйте те же самые ObjectOutputstream и ObjectInputStream для срока службы разъема на обоих концах. То же самое относится к большинству других типов потоков и читателей/писателей, за исключением того, что последствия этого не являются обычно более загадочными.

+0

Спасибо, я удалил это. Предполагалось, что я не был там, где я экспериментировал, первая ошибка была вызвана дублированной записью, отмеченной @ Krroae27. Вы можете увидеть отредактированный вопрос об ошибке с нулевым указателем и увидеть очевидные ошибки, которые я сделал в коде? –

+0

Нет. Профессиональные программисты, как ожидается, смогут самостоятельно сортировать NPE. Если бы вы спросили, что в качестве вопроса он будет закрыт как дубликат почти мгновенно. – EJP

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