JAVA:将对象发送到服务器

时间:2015-03-07 11:46:34

标签: java object client server

我是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);
        }
    }

}

抱歉我的英文不好

提前致谢!

1 个答案:

答案 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>