java - 使用 ObjectInputStream 等待来自套接字的数据

标签 java sockets casting streaming

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

@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);

最佳答案

没有必要进行这种偷看和 sleep 的行为。这完全是浪费您的时间和精力以及 CPU 时间和空间。

所有 Java 流在没有数据时都会阻塞。它们阻塞的时间也完全正确,一次不是 10 毫秒或其他任何时间,并且不会像您所做的那样在旋转中浪费 CPU 周期。

您不必以任何方式自己做任何事情。只需调用readObject()即可。

并且永远不要忽略IOException

关于java - 使用 ObjectInputStream 等待来自套接字的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12458436/

相关文章:

java - 是否可以先读取然后写入同一个电子表格文件?

java - elasticsearch java批量批量大小

java - 使用奇怪的格式通过套接字发送数据

perl - Net::SSLeay 在访问 pop.gmail.com 时出现 ":SSL3_GET_SERVER_CERTIFICATE:certificate verify failed"失败,正如许多其他人所看到的那样

Java/Android 如何从 html 响应中获取 JSON?

java如何在实现父方法的同时扩展一个类

c - Raspberry Pi 客户端到 Mac 服务器错误

c++ - 将 char 类型转换为字符串时,代码始终返回 255 或 -1073741819

javascript - 为什么 JavaScript 坚持将 float 转换为整数?

java - 整数或 double 返回值