【问题标题】:Can't send objects using Sockets无法使用套接字发送对象
【发布时间】: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()。 NB readObject() 不会在流结束时返回 null,因此循环它是不正确的。它抛出EOFException

标签: java sockets input output


【解决方案1】:

您可以尝试flush 缓冲流:

os.flush()

这将强制流实际发送序列化对象的字节。没有它,BufferedOutputStream 可能只是等待并缓冲数据,正如其名称所说。这样做是为了使发送的数据包的大小不会变得太小,如果要发送多个对象,这将导致大量开销。

如果你完成了,你还是应该关闭流。

【讨论】:

  • 我在发送此对象之前添加了 os.flush() 但我没有更改任何内容。
  • “之前”冲洗应该有什么帮助?
  • 对不起,我的意思是,它看起来像:oos.writeObject(rooms); oos.flush();
  • Class Rooms 是一个对象列表 Room,所以我尝试将这个 List 的每个元素发送到 for 循环中并且它有效,这不是最好的主意,但我无法发送整个房间对象.
  • 如果您在编辑中删除了BufferedStreams,那么答案无论如何都是过时的。考虑先清理代码并正确关闭所有流。这在这里:docs.oracle.com/javase/tutorial/essential/exceptions/… 可能有用。
猜你喜欢
  • 1970-01-01
  • 2021-08-15
  • 2012-09-15
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 2014-01-11
相关资源
最近更新 更多