提问人:Antoniossss 提问时间:5/27/2014 最后编辑:EinarAntoniossss 更新时间:5/27/2014 访问量:1086
发送数据和关闭套接字时如何避免EOF?
How to avoid EOF while sending data and closing socket?
问:
我需要有条件地通过网络发送一些数据。我遇到了奇怪的问题,我的连接看起来像是在整个数据发送之前关闭的。
服务器
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());
如您所见,我想在关闭连接之前将逻辑发送到客户端(套接字在块中关闭false
finally
但是,在客户端,我有以下错误
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);
为什么会这样?我是否必须在服务器端关闭套接字,当我在客户端关闭套接字时,它会自动关闭吗?如果我不这样做,一切都很好,但是资源泄漏呢?
答: 暂无答案
评论
readBoolean()
false
boolean
false