Java OIS卡在readObject上..如何解除阻塞?

时间:2016-04-24 22:53:23

标签: java sockets

我有一个客户端和服务器

服务器 - 提供cookie

客户端 - 请求cookie,然后在交付后打印它们。

我知道在输出流被写入和刷新之前OIS被阻塞,但我不确定这意味着什么?我在写完请求后尝试调用flush(),但那并没有起作用。

第二次调用OIS #readObject后它会卡住。

这是我的代码:

public class CookieServer {

public static void main(String[] args) {
    ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(4444);
    } catch(IOException e) {

    }

    while(true) {
        try(
                Socket clientSocket = serverSocket.accept();
                ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
                ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
        ) {
            Object inObject;
            while((inObject = in.readObject()) != null) {
                if(inObject instanceof String) {
                    if (((String) inObject).equalsIgnoreCase("Give Me Two Random Cookies")) {
                        out.writeObject(new Cookie("Chocalate Chip"));
                        out.flush();
                        out.writeObject(new Cookie("blueberry Chip"));
                        out.flush();
                    }
                }
            }
        } catch(Exception e) {

        }
        sleep(1000);
    }
}


private static void sleep(long amount) {
    try {
        Thread.sleep(amount);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

public class CookeClient {

public static void main(String[] args) {

    while(true) {

        try (Socket echoSocket = new Socket("localhost", 4444);
             ObjectOutputStream out = new ObjectOutputStream(echoSocket.getOutputStream());
             ObjectInputStream in = new ObjectInputStream(echoSocket.getInputStream())) {

            out.writeObject("Give Me Two Random Cookies");

            Object inObject;
            while((inObject = in.readObject()) != null) { // gets stuck here...
                if(inObject instanceof Cookie) {
                    System.out.println("Received a: " + ((Cookie) inObject).getName() + "cookie");
                }
            }
        } catch (Exception e) {

        }

        sleep(100);
    }
}


private static void sleep(long amount) {
    try {
        Thread.sleep(amount);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

public class Cookie implements Serializable{

private String name;
public Cookie(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

}

因为我迷路了,请帮助我。

1 个答案:

答案 0 :(得分:0)

当您只期待两个回复时,您正在使用循环。这没有意义。只需拨打readObject()两次。

注意你的循环无论如何都是错误的。 readObject()在流结束时不返回null。它抛出EOFException。因此,使用null作为循环终止条件是不正确的。它可以在您写入null时返回null。

当没有可用数据时,它也不会返回null。它会阻止。