我有一个客户端和服务器
服务器 - 提供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;
}
}
因为我迷路了,请帮助我。
答案 0 :(得分:0)
当您只期待两个回复时,您正在使用循环。这没有意义。只需拨打readObject()
两次。
注意你的循环无论如何都是错误的。 readObject()
在流结束时不返回null。它抛出EOFException
。因此,使用null作为循环终止条件是不正确的。它可以在您写入null时返回null。
当没有可用数据时,它也不会返回null。它会阻止。