使用ObjectInputStream从套接字等待数据

时间:2012-09-17 11:40:19

标签: java sockets casting streaming

我正在等待流上的数据这种奇怪的方式...因为我认为每次流尝试readObject()时抛出异常都不是一个好主意。这就是我使用PushBackInputStream并且每10毫秒从该流中只读取一个byte的原因。

@Override
public void run() {
try {
    ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(
        clientSocket.getOutputStream()));
    oos.flush();
    ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
    PushbackInputStream pis = new PushbackInputStream(clientSocket.getInputStream());
    while (true) {
    int tempByte = -1;
    if ((tempByte = pis.read()) == -1) {
        sleep(10);
    } else {
        pis.unread(tempByte);
        ArrayList<Object> arrList = (ArrayList<Object>) ois.readObject();
        int command = (Integer) arrList.get(0);
        if (command == CommandDescriptor.ADD_STRING.getCode()) {
        String tempStr = (String) arrList.get(1);
        boolean result = Server.colleciton.add(tempStr);
        if (result) {
            oos.writeInt(1);
            oos.flush();
        } else {
            oos.writeInt(0);
            oos.flush();
        }
        } else if (command == CommandDescriptor.REMOVE_STRING.getCode()) {
        ...

我对溪流做错了...我得到了一个例外:

Exception in thread "Thread-0" java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to java.util.ArrayList
at com.rizhov.main.ClientHandler.run(ClientHandler.java:39)

代码的那一部分:

ArrayList<Object> arrList = (ArrayList<Object>) ois.readObject();

我做错了什么?有没有更好的解决方案来等待数据。

更新:

ArrayList<Object> arrList = null;
    for (;;) {
        try {
        arrList = ((ArrayList<Object>) ois.readObject());
        break;
        } catch (Exception e) {

        }
    }
    int command = (Integer) arrList.get(0);

2 个答案:

答案 0 :(得分:2)

没有必要偷看和睡觉。这完全浪费你的时间和精力以及CPU时间和空间。

所有Java流都在没有数据的情况下阻塞。它们也可以完全锁定正确的时间,而不是一次阻止10ms或任何时间,并且不会在旋转时浪费CPU周期。

您无需以任何形式或形式自行完成任何操作。只需致电readObject()

永远不要忽视IOException

答案 1 :(得分:1)

您只能包装一次Stream。如果你多次包装它,你可能会感到困惑而不是它有用。

一旦流关闭,它将不会重新打开,因此读取一个字符以检查流是否已完成并丢弃它并不是非常有用。无论如何操作都会阻塞睡觉也不是很有用。

我会使用枚举值,而不是使用Integer代码。这将更清洁,您将能够使用switch语句。