我有一个服务器和客户端连接使用套接字来传输文件,但如果我希望能够在用户JButton操作时从客户端向服务器发送字符串,则会抛出套接字关闭错误(因为我使用了dos.close( )在Sender()构造函数中)。问题是,如果我不使用dos.close(),客户端程序将不会运行/初始化UI框架。我究竟做错了什么?我需要能够在程序首次运行时发送文件,然后再发送数据。
发信人:
public Sender(Socket socket) {
List<File> files = new ArrayList<File>();
files.add(new File(Directory.getDataPath("default.docx")));
files.add(new File(Directory.getDataPath("database.db")));
try {
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
DataOutputStream dos = new DataOutputStream(bos);
dos.writeInt(files.size());
for (File file : files) {
dos.writeLong(file.length());
dos.writeUTF(file.getName());
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
int theByte = 0;
while ((theByte = bis.read()) != -1) {
bos.write(theByte);
}
bis.close();
}
dos.close(); // If this is disabled, the program won't work.
} catch (Exception e) {
e.printStackTrace();
}
}
下载器:
public static byte[] document;
public Downloader(Socket socket) {
try {
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
DataInputStream dis = new DataInputStream(bis);
int filesCount = dis.readInt();
for (int i = 0; i < filesCount; i++) {
long size = dis.readLong();
String fileName = dis.readUTF();
if (fileName.equals("database.db")) {
List<String> data = new ArrayList<String>();
BufferedReader reader = new BufferedReader(new InputStreamReader(bis));
String line;
while ((line = reader.readLine()) != null) {
if (line.trim().length() > 0) {
data.add(line);
}
}
reader.close();
parse(data);
} else if (fileName.equals("default.docx")) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
for (int x = 0; x < size; x++) {
bos.write(bis.read());
}
bos.close();
document = bos.toByteArray();
}
}
//dis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:0)
客户端中的第一个接收循环终止于EOS,只有当您关闭发送方中的套接字时才会发生这种情况,而您不希望这样做。在每种情况下,您都会在文件前面发送长度,因此接收代码在两种情况下都应如下所示:
long total = 0;
while ((total < size && (count = in.read(buffer, 0, size-total > buffer.length ? buffer.length : (int)(size-total))) > 0)
{
total += count;
out.write(buffer, 0, count);
}
out.close();
该循环从套接字输入流中精确读取size
字节并将其写入OutputStream
out
,无论out
恰好是什么:在第一种情况下, FileOutputStream,在第二个,ByteArrayOutputStream
。