當我使用套接字編程傳輸大文件時,接收到的文件不完整,即它是一個mp3文件,當我播放聲音時很奇怪。 的代碼是:帶插座的大文件傳輸
服務器端:
File myFile = new File("abc.mp3");
{
Socket sock = servsock.accept();
int packetsize=1024;
double nosofpackets=Math.ceil(((int) myFile.length())/packetsize);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
for(double i=0;i<nosofpackets+1;i++) {
byte[] mybytearray = new byte[packetsize];
bis.read(mybytearray, 0, mybytearray.length);
System.out.println("Packet:"+(i+1));
OutputStream os = sock.getOutputStream();
os.write(mybytearray, 0,mybytearray.length);
os.flush();
}
}
客戶端:
int packetsize=1024;
FileOutputStream fos = new FileOutputStream("zz.mp3");
BufferedOutputStream bos = new BufferedOutputStream(fos);
double nosofpackets=Math.ceil(((int) (new File("abc.mp3")).length())/packetsize);
for(double i=0;i<nosofpackets+1;i++)
{
InputStream is = sock.getInputStream();
byte[] mybytearray = new byte[packetsize];
int bytesRead = is.read(mybytearray, 0,mybytearray.length);
System.out.println("Packet:"+(i+1));
bos.write(mybytearray, 0,mybytearray.length);
}
sock.close();
bos.close();
在我使用只是簡單的客戶端(我可以把長度來自服務器端的文件)。
如果客戶端和服務器是同一臺機器,則該代碼可以很好地工作,但如果文件位於不同的計算機上,則該文件會變形。
如果您有緩衝輸出流,爲什麼要手動緩衝?你爲什麼不把所有東西都讀完,一次寫完呢? – corsiKa 2011-02-25 05:31:53
是不是有限制的緩衝區的大小。因此,我把文件分成n塊發送它們。 – anonymous123 2011-02-25 05:34:57
@anonymous當然有一個限制,但你不必寫所有的分塊傳輸。它會自動發生。 – EJP 2013-08-01 05:33:21