问题
Well, I am trying to read a .xml file from the XMLParser so basically I want to read the XML files and print it out from the server to the client, but while running the client code i am getting:
java.io.StreamCorruptedException: invalid type code: AC
The Client code is:
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();
}
}
The full error is:
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)
Can anyone give a fix to this, I am sure its something small but I can't figure it out though.
Thanks
EDIT: The server code is:
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: New error after deleting the duplicate entry:
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)
回答1:
You are double opening an ObjectOutputStream on the same socket in the Server class which is causing special headers to be sent twice.
1: openSockets
last line outputToClient = new ObjectOutputStream(clientSocket.getOutputStream());
2: writeToSocket
first line outputToClient = new ObjectOutputStream(clientSocket.getOutputStream());
Remove whichever one you want and it should work just fine.
As for the nullpointer you are now receiving I have a feeling that video is null in the client. In the code you have posted that would make sense because in the server you never create a video array and as such the client is just receiving null.
回答2:
This error is caused by using more than one ObjectOutputStream
on the same socket. Use the same ObjectOutputstream
and ObjectInputStream
for the life of the socket, at both ends. Same goes for most other stream and reader/writer types, except that the consequences of not doing so are usually even more mysterious.
来源:https://stackoverflow.com/questions/10475603/java-io-streamcorruptedexception-invalid-type-code-ac-error-found-while-run