客户端服务器文件传输
Client Server File Transfer
您好,我在将文件从客户端传输到服务器端时遇到问题。从我最初的研究中,我发现了可用于传输的 DataInputStream。但不幸的是,使用 DataInput/Output Stream 传输的文件已损坏。文件大小保持不变,但是当我打开文件时,我看不到内容并且文本显示其中的十六进制内容。
从一些 Internet 链接中,我发现这可能是由于打开的套接字或流引起的,但效果不佳。谁能帮我解决这个问题。每次传输后我的文件都会损坏。
下面是我的代码:
Client Side Code
if (isConnected) {
File transferFile = new File(dir);
if (!transferFile.exists() || !transferFile.canRead()) {
System.out.println("error");
System.err.println();
}
OutputStream os = clientSocket.getOutputStream();
byte[] bytearray = new byte[(int) transferFile.length()];
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(transferFile.getName());
dos.writeLong(bytearray.length);
dos.write(bytearray, 0, bytearray.length);
dos.flush();
dos.close();
os.close();
Server Side Code
/* Test Code */
InputStream is = socket.getInputStream();
DataInputStream in = new DataInputStream(is);
String fileName =in.readUTF();
OutputStream output = new FileOutputStream(fileName);
long size = in.readLong();
byte[] buffer = new byte[1024];
int bytesRead;
while (size > 0 && (bytesRead = in.read(buffer, 0, (int)Math.min(buffer.length, size))) != -1)
{
output.write(buffer, 0, bytesRead);
size -= bytesRead;
}
is.close();
output.close();
in.close();
socket.close();
Content of Input File:
This is a test file.
Contents of Output File:(Received by Server)
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000
你实际上从来没有写过文件。您只是在编写一个与文件大小相同的零值字节数组(您的 bytearray
变量)。服务器接收充满零值字节的字节数组,并将其保存到文件中。服务器保存的文件因此具有与原始文件相同的大小,但充满了零 (NULL),这在大多数文本编辑器中将显示为垃圾。您需要先将文件内容实际写入bytearray
。
您好,我在将文件从客户端传输到服务器端时遇到问题。从我最初的研究中,我发现了可用于传输的 DataInputStream。但不幸的是,使用 DataInput/Output Stream 传输的文件已损坏。文件大小保持不变,但是当我打开文件时,我看不到内容并且文本显示其中的十六进制内容。
从一些 Internet 链接中,我发现这可能是由于打开的套接字或流引起的,但效果不佳。谁能帮我解决这个问题。每次传输后我的文件都会损坏。
下面是我的代码:
Client Side Code
if (isConnected) {
File transferFile = new File(dir);
if (!transferFile.exists() || !transferFile.canRead()) {
System.out.println("error");
System.err.println();
}
OutputStream os = clientSocket.getOutputStream();
byte[] bytearray = new byte[(int) transferFile.length()];
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(transferFile.getName());
dos.writeLong(bytearray.length);
dos.write(bytearray, 0, bytearray.length);
dos.flush();
dos.close();
os.close();
Server Side Code
/* Test Code */
InputStream is = socket.getInputStream();
DataInputStream in = new DataInputStream(is);
String fileName =in.readUTF();
OutputStream output = new FileOutputStream(fileName);
long size = in.readLong();
byte[] buffer = new byte[1024];
int bytesRead;
while (size > 0 && (bytesRead = in.read(buffer, 0, (int)Math.min(buffer.length, size))) != -1)
{
output.write(buffer, 0, bytesRead);
size -= bytesRead;
}
is.close();
output.close();
in.close();
socket.close();
Content of Input File:
This is a test file.
Contents of Output File:(Received by Server)
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000
你实际上从来没有写过文件。您只是在编写一个与文件大小相同的零值字节数组(您的 bytearray
变量)。服务器接收充满零值字节的字节数组,并将其保存到文件中。服务器保存的文件因此具有与原始文件相同的大小,但充满了零 (NULL),这在大多数文本编辑器中将显示为垃圾。您需要先将文件内容实际写入bytearray
。