JAVA : 发送对象到服务器
JAVA : Send an object to the 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);
}
}
}
抱歉我的英语不好
提前致谢!
你的问题是你在服务器端读取一行并将其作为昵称,但你从未将它发送到服务器。在将用户 object 发送到服务器之前,您需要将昵称作为字符串发送。在对客户端代码影响最小的情况下,我能想到的最佳方法是:
Client-side:
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(nick + "\r\n");
oos.writeObject(user);
假设 nick
是一个字符串。
抛出 StreamCorruptedException
的原因是,在您阅读了序列化 User
object 的一部分并将其用作昵称后,您实例化了一个 ObjectInputStream
立即尝试读取序列化 object header。由于您已经阅读了 object header,接下来的几个字节作为 header 无效,因此 ObjectInputStream 抱怨。
编辑: 在你澄清你实际上是在发送昵称之后,你的问题可能是你再次从套接字中检索 InputStream (getInputStream()
)。尝试获取流,使用 BufferedReader 从中读取并且不关闭 reader(因为这将关闭流),然后在读取您的User
.
我是 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);
}
}
}
抱歉我的英语不好
提前致谢!
你的问题是你在服务器端读取一行并将其作为昵称,但你从未将它发送到服务器。在将用户 object 发送到服务器之前,您需要将昵称作为字符串发送。在对客户端代码影响最小的情况下,我能想到的最佳方法是:
Client-side:
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(nick + "\r\n");
oos.writeObject(user);
假设 nick
是一个字符串。
抛出 StreamCorruptedException
的原因是,在您阅读了序列化 User
object 的一部分并将其用作昵称后,您实例化了一个 ObjectInputStream
立即尝试读取序列化 object header。由于您已经阅读了 object header,接下来的几个字节作为 header 无效,因此 ObjectInputStream 抱怨。
编辑: 在你澄清你实际上是在发送昵称之后,你的问题可能是你再次从套接字中检索 InputStream (getInputStream()
)。尝试获取流,使用 BufferedReader 从中读取并且不关闭 reader(因为这将关闭流),然后在读取您的User
.