【发布时间】:2018-02-02 22:54:45
【问题描述】:
您好,我正在编写一个应用程序,其中客户端将房间名称发送到服务器,服务器创建它,然后发送回整个房间列表。我从服务器接收这个对象时遇到问题,当我关闭客户的应用程序并再次打开时,我有房间列表,就像它应该的那样。我在客户端应用程序中刷新房间列表,但它总是空的,只有重新打开有帮助,这很奇怪,我不知道这个问题。
在客户端:
getIs() method is returning is object
getOs() method returning os object
this.os = new ObjectOutputStream(clientSocket.getOutputStream());
this.is = new ObjectInputStream(clientSocket.getInputStream());
private void createRoom(ActionEvent event) {
String roomName = "CreateRoom ";
roomName += setRoomName();
String response = null;
try {
client.getOs().writeObject(roomName);
response = (String) client.getIs().readObject();
System.out.println(response);
} catch (IOException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void refreshRooms() {
String response = null;
try {
client.getOs().writeObject("RefreshRooms");
response = (String) client.getIs().readObject();
System.out.println(response);
rooms = (Rooms) client.getIs().readObject();
System.out.println("Print in client: ");
rooms.printAllRooms();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
服务器:
this.os = new ObjectOutputStream(connection.getOutputStream());
this.is = new ObjectInputStream(connection.getInputStream());
public void run() {
String inputRequest = null;
try {
while((inputRequest = (String) ois.readObject()) != null) {
System.out.println(inputRequest);
handleRequest(inputRequest);
}
} catch (IOException | ClassNotFoundException e) {
System.out.println("Client has disconnected.");
e.printStackTrace();
}
}
private void handleRequest(String request) {
String response = null;
String[] msg = request.split(" ");
if(msg[0].equals("CreateRoom")) {
try {
oos.writeObject("You want create a room.");
Room newRoom = new Room(msg[1]);
rooms.addRoom(newRoom);
System.out.println("Created room: " + newRoom.getName());
System.out.println("\n Print after creation: ");
rooms.printAllRooms();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if (msg[0].equals("RefreshRooms")) {
try {
oos.writeObject("You want list of rooms.");
System.out.println("Print before send.");
rooms.printAllRooms();
oos.writeObject(rooms);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
///编辑: 所以我删除了 PrintWriter 和 BufferedReader 对象,现在我只使用对象流。现在不行的是:
我一个接一个地创建了一些房间,然后刷新客户端应用程序上的房间列表 - 在这种情况下,我得到了所有房间
但是当我创建一个房间刷新然后创建另一个并刷新时,我在第二次刷新后只得到 1 个房间,所以基本上当我刷新服务器时,总是从第一次发送给我发送相同的对象,我不知道如何更改它。
我还在服务器端打印这些房间,并始终获取所有房间,因此可以创建房间。
【问题讨论】:
-
你的问题是?注意你不能像这样在同一个套接字上混合缓冲流。下定决心。您正在使用缓冲的读取器和写入器或对象流。你不能两者兼得。
-
服务器收到消息了吗?
-
好吧,我改为对象流,但我有同样的问题。服务器获取消息但即使我修改它也总是发送相同的对象。
-
您需要调查
ObjectOutputStream.reset()。 NBreadObject()不会在流结束时返回 null,因此循环它是不正确的。它抛出EOFException。