2 acmen99 Acmen99 于 2016.02.25 18:50 提问

socket通信中,socket建立连接后能进行长时间的反复读写操作吗?

服务端和客户端以socket建立连接进行通信,我想以单线程实现多文件传输,循环发送多个文件,只是对输入输出流进行打开和关闭,为什么第一个文件传完后进行第二个文件传输时会抛异常:Socket is closed?求高手指点迷津,难道一定要关闭socket然后重新连接吗?

6个回答

qsjh898
qsjh898   2016.02.25 20:03

不需要,肯定是你代码写得有问题。不妨把代码贴出来看看

Acmen99
Acmen99 代码有点长!这里面没法贴!
接近 2 年之前 回复
enpterexpress
enpterexpress   2016.02.25 20:18
wangyaninglm
wangyaninglm   Ds   Rxr 2016.02.25 20:55

上代码看看,估计是你fclose()或者指针那里的句柄提前关闭了

Acmen99
Acmen99   2016.02.26 09:30

while ((len = inStream.read(buffer)) != -1) {// 从输入流中读取数据写入到文件中
fileOutStream.write(buffer, 0, len);
length += len;
Message msg = mHandler.obtainMessage();
msg.getData().putString("order", "update_pbar");
msg.getData().putString("client_ip", clientId);
msg.getData().putString("filename", file.getName());
msg.getData().putInt("percent", (int) (100 * length / file.length()));
mHandler.sendMessage(msg);
mFileLog.delete(fileId);
mFileLog.insert(fileId, file.getAbsolutePath(), length + "");
}
// 文件接收完成
if (length == Long.parseLong(filelength)) {
fileOutStream.close();
inStream.close();
mFileLog.delete(fileId);
outStream.write("OK\n".getBytes("utf-8"));
outStream.close();
}
file = null;

Acmen99
Acmen99   2016.02.26 09:37

上面的是服务端的代码,这两个都是做的安卓app;Message 是子线程发消息更新进度条。 mFileLog是我自己建的SQLlite数据库表的操作!
while ((len = fileOutStream.read(buffer)) != -1) {//将文件读到输出流
outStream.write(buffer, 0, len);
length += len;
Message msg = mHandler.obtainMessage();
msg.getData().putString("order", "update_pbar");
msg.getData().putString("filename", file.getName());
msg.getData().putInt("percent", (int) (100 * length / file.length()));
mHandler.sendMessage(msg);
}

                        fileOutStream.close();
                        outStream.close();
                        if (length == file.length()) {
                            // 文件上传完成删除记录,下次上传重新上传
                            String result = null;
                            BufferedReader br = new BufferedReader(new InputStreamReader(is));
                            while ((result = br.readLine()) != null) {
                                if (result.equals("OK")) {
                                    mLog.delete(fileId);
                                }
                            }
                            inStream.close();
                            br.close();
                        }
Acmen99
Acmen99   2016.02.26 09:40

我想客户端发完一个文件后,等待服务端回复"OK"后再进行第二个文件的传输!可是while循环后不管关不关流,客户端和服务端总有一个要抛异常报socket is closed!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!