发送数据和关闭套接字时如何避免EOF?

How to avoid EOF while sending data and closing socket?

提问人:Antoniossss 提问时间:5/27/2014 最后编辑:EinarAntoniossss 更新时间:5/27/2014 访问量:1086

问:

我需要有条件地通过网络发送一些数据。我遇到了奇怪的问题,我的连接看起来像是在整个数据发送之前关闭的。

服务器

String id = String.valueOf(dis.readLong());
String path = createPathToFile(id);
File image = getFile(path);

if (image == null) {
    log.debug("No image for id {}", id);
    dos.writeBoolean(false);
    dos.flush();
    return;
} else {
    log.debug("Streaming #{}", image.getName());

如您所见,我想在关闭连接之前将逻辑发送到客户端(套接字在块中关闭falsefinally

但是,在客户端,我有以下错误

19:40:29.914 [pool-1-thread-1] ERROR [l.choina.imagetransfer.client.Client] - Fatal:
java.io.EOFException: null
        at java.io.DataInputStream.readBoolean(DataInputStream.java:244) ~[na:1.7.0_55]
        at pl.choina.imagetransfer.client.Client$WorkerTask.run(Client.java:98) ~[image-transfer.jar:na]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_55]
        at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_55]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_55]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_55]
        at java.lang.Thread.run(Thread.java:745) [na:1.7.0_55]

看起来套接字在布尔值到达客户端 sie 之前被关闭。

客户

try (
    Socket s = new Socket(params.getHost(), params.getPort());
    DataInputStream dis = new DataInputStream(s.getInputStream());
    DataOutputStream dos = new DataOutputStream(s.getOutputStream());
) {
    //connect to remote host
    dos.writeLong(id);
    dos.flush();
    boolean result = dis.readBoolean(); // line 98 - throwing exception

    if (result == false) {
        log.info("Image #{} not available", id);

为什么会这样?我是否必须在服务器端关闭套接字,当我在客户端关闭套接字时,它会自动关闭吗?如果我不这样做,一切都很好,但是资源泄漏呢?

Java 套接字 EOF

评论

0赞 fmodos 5/27/2014
好吧,在你阅读布尔值的时候,服务器可能还没有写出布尔值......在阅读之前使用 dis.available() 检查是否有任何数据
2赞 Antoniossss 5/27/2014
但是阻止操作,因此它会等待发送某些内容。我不认为这不是问题。readBoolean()
1赞 user207421 5/27/2014
完全。@fmodos available() 的正确用法很少,这不是其中之一。
0赞 user207421 5/27/2014
你确定你正在编写布尔值吗?延绳钓会被记录下来吗?在我看来,在这一步之前,插座似乎已经关闭。
0赞 Antoniossss 5/28/2014
你是对的,套接字应该在发送后关闭,因为不会有进一步的通信 - 套接字在服务器端关闭在最终块中。但是,客户端没有收到,但会收到有关连接关闭的通知。关闭套接字不应该发送某种 EOF 吗?关闭套接字和关闭输出流之间有区别吗?也许我应该在发送后手动关闭输出流,然后再关闭套接字?falsebooleanfalse

答: 暂无答案