我是网络编程新手,我正在java中做一个聊天程序。我第一次使用DataOutputStream并且工作正常,但我认为如果我使用Object Streams会让我发送用户信息会更加整洁。问题是ObjectOutPutStream不会每次都为我发送。事实上,它每三次发送一次的常规模式。同样处理服务器的消息,客户端每隔三次接收一次。
以下是一些代码:
客户方:
public void start() throws IOException{
output = new ObjectOutputStream(socket.getOutputStream());
if (thread == null) {
client = new ChatClientThread(this, socket);
thread = new Thread(this);
thread.start();
}
}
public void sendMessage(String msg){
try {
output.writeObject(new Message(msg));
output.flush();
}catch (IOException ioe) {
System.out.println("Sending error: " + ioe.getMessage());
stop();
}
}
服务器端:
public void run() {
System.out.println("Server Thread " + ID + " running.");
while (true) {
try {
if(streamIn.readObject() instanceof Message){
System.out.println((Message)streamIn.readObject());
server.handleMessage(ID, (Message)streamIn.readObject());
}
}catch (IOException ex) {
System.out.println("Listening error: " + ex.getMessage());
server.remove(ID);
} catch (ClassNotFoundException ex) {
System.out.println("Class was not found");
}
}
}
public void open() throws IOException {
streamOut = new ObjectOutputStream(socket.getOutputStream());
streamIn = new ObjectInputStream(socket.getInputStream());
}
为什么会发生这种情况?
答案 0 :(得分:0)
我认为你的问题是你从ObjectInputStream
多次读取,假设所有这些时间你都会获得相同的对象。但事实上,你只是失去它并阅读下一个。
尝试重写您的服务器代码:
System.out.println("Server Thread " + ID + " running.");
while (true) {
try {
Object message = streamIn.readObject();
if (message instanceof Message) {
System.out.println((Message) message);
server.handleMessage(ID, (Message) message);
}
} catch (IOException ex) {
System.out.println("Listening error: " + ex.getMessage());
server.remove(ID);
} catch (ClassNotFoundException ex) {
System.out.println("Class was not found");
}
}
请注意,每个循环只读取一次消息,并将其存储在可以进行测试的变量message
中。
此外,我会添加else
阻止记录消息,由于某种原因,该消息恰好不是Message
的实例。并在catch
块中使用stacktrace打印实际异常。