我是JAVA的初学者,我尝试将一个对象从我的客户端发送到我的服务器。
来自客户端的第一个对象可以工作,但是当我运行另一个客户端时,
第一个对象运行服务器的异常:
Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 7372000F
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
at ircproject.MainServer.main(MainServer.java:43)
Java结果:1
我不明白为什么。
这是我的代码:
客户:
public class MainClient {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
Socket socket;
Scanner ScanNick;
String nick;
socket = new Socket(InetAddress.getLocalHost(), 2009);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //Les données envoyées par le serveur
String message_distant = in.readLine(); //Premier message envoyé du client
System.out.println(message_distant);//On l'affiche
System.out.println("Bonjour, quel est votre pseudo? ?");
ScanNick = new Scanner(System.in);
nick = ScanNick.nextLine();
User user = new User(nick, false, false, true);
PrintWriter out = new PrintWriter(socket.getOutputStream()); //On prépare l'envoie du pseudo
out.println(user.getNick()); //C'est le message qu'on veut envoyé
out.flush();//On l'envoie
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(user);
服务器:
public class MainServer extends Thread {
private static final boolean stop = false;
public static void main(String[] args) throws IOException, InterruptedException {
// TODO code application logic here
ServerSocket socketserver;
Socket socketduserveur;
socketserver = new ServerSocket(2009); //Création d'un serveur sur le port 2009
while (!stop) {
try {
socketduserveur = socketserver.accept(); //On accepte les connexions
PrintWriter out = new PrintWriter(socketduserveur.getOutputStream()); //Objet PrintWriter pour envoyé un message au serveur
out.println("Coucou Client :)"); //Message dans l'objet PrintWriter qui va etre envoyé au client
out.flush(); // Envoie du message
BufferedReader in = new BufferedReader(new InputStreamReader(socketduserveur.getInputStream())); //On va lire une donnée envoyé par le serveur
String nick = in.readLine(); //On stock le message dans la variable nick
System.out.println(nick + " c'est connecté");
ObjectInputStream ois = new ObjectInputStream(socketduserveur.getInputStream());
User u = (User)ois.readObject();
u.addUserList(u.getNick());
u.addUserList("john");
if(u.listAlone()){
System.out.println("Vous etes admin");
}
} catch (ClassNotFoundException ex) {
Logger.getLogger(MainServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
抱歉我的英文不好
提前致谢!
答案 0 :(得分:0)
您的问题是您在服务器端读取了一行并将其作为昵称,但您从未将其发送到服务器。在将用户对象发送到服务器之前,需要将昵称作为String发送。对客户端代码的影响最小,我能想到的最佳方法是:
客户端:
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(nick + "\r\n");
oos.writeObject(user);
假设nick
是一个字符串。
抛出StreamCorruptedException
的原因是,在您读取序列化User
对象的一部分并将其用作昵称后,您实例化ObjectInputStream
,它会立即尝试读取序列化对象标题。由于您已经读取了对象标头,因此接下来的几个字节作为标头无效,因此ObjectInputStream会抱怨。
编辑:在您澄清实际上是在发送昵称后,您的问题可能是您再次从套接字中检索InputStream(getInputStream()
)。尝试获取流,使用BufferedReader读取它并且不关闭读取器(因为这将关闭流),然后在读取User
之前使用相同的InputStream 实例化ObjectInputStream 。 / p>