【发布时间】:2015-03-27 10:40:07
【问题描述】:
我正在制作一个将文件从服务器发送到客户端的程序。该程序本身运行,适用于任何 64KB 及以下的文件,但是当我尝试发送大于该文件的文件时,它只传输 64KB,例如,我尝试发送一个 232KB 的文件 test.txt,程序只输出了一个 64KB文件收到Test.txt。
这是服务器代码
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class FileTransferServer {
public static void main(String[] args) throws IOException {
ServerSocket servsock = new ServerSocket(1234);
File myFile = new File("C:/Users/Owner/Downloads/test.txt");
while (true) {
Socket sock = servsock.accept();
byte[] mybytearray = new byte[(int) myFile.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
bis.read(mybytearray, 0, mybytearray.length);
OutputStream os = sock.getOutputStream();
os.write(mybytearray, 0, mybytearray.length);
os.flush();
sock.close();
}
}
}
这是客户
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;
public class FileTransferClient {
public static void main(String[] argv) throws Exception {
Socket sock = new Socket("127.0.0.1", 1234);
byte[] mybytearray = new byte[409600];
InputStream is = sock.getInputStream();
FileOutputStream fos=newFileOutputStream("C:/Users/Owner/Downloads/receivedTest.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int bytesRead = is.read(mybytearray, 0, mybytearray.length);
bos.write(mybytearray, 0, bytesRead);
bos.close();
sock.close();
}
}
任何帮助将不胜感激,无法找出发生了什么。
编辑:谢谢大家,它现在可以工作了,我将客户端代码更改为:
import java.io.*;
import java.net.*;
public class FileTransferClient {
public static void main(String[] argv) throws Exception {
Socket sock = new Socket("127.0.0.1", 1234);
byte[] mybytearray = new byte[1024];
int count;
InputStream is = sock.getInputStream();
FileOutputStream fos = new FileOutputStream("C:/Users/Owner/Downloads/receivedTest.jpg");
BufferedOutputStream bos = new BufferedOutputStream(fos);
while ((count = is.read(mybytearray)) > 0)
{
bos.write(mybytearray, 0, count);
}
bos.close();
sock.close();
}
}
【问题讨论】:
-
您是否尝试过分块而不是整体地写入/读取文件?另外,当文件超过 400kb 时会发生什么?
-
你知道
is.read不会读取整个数组,对吧?它读取“1 到 mybytearray.length 之间的任意数量的字节”。服务器上的bis.read相同。 (write像你期望的那样工作,并且写了整个事情)
标签: java sockets limit file-transfer