大きな容量のファイルを転送する
UserModeLinuxを起動する際のルートファイルシステム(4294971392バイト)
をサーバ側からクライアント側に転送したいと考えています。
以下のプログラムを実行した結果、エラーが出てしまいます。
容量が大きなファイルのため、出てきてしまうエラーだと思うのですが。
またおかしなことに、エラーが出るのでプログラムを停止して
クライアント側のディレクトリを確認すると
ルートファイルシステムが存在し、UserModeLinuxを起動することもできました。しかしコンソールにはエラーが表示されるので困っています。
このような場合にどのように対処するべきでしょうか。
サーバ側
import java.net.*;
import java.io.*;
public class FileTransferServerroot {
public static void main(String[] args) throws IOException{
if (args.length != 2)
throw new IllegalArgumentException("Arguments should be host,port and filepath");
int serverPort = Integer.parseInt(args[0]);
String filename = args[1];
byte[] data = new byte[32];
//ソケットの作成
ServerSocket socket = new ServerSocket(serverPort);
Socket sock = socket.accept();
System.out.println("Connected to server");
//ストリームの作成
FileInputStream fin = new FileInputStream(filename);
OutputStream out = sock.getOutputStream();
//ファイルの内容を読み出し、送信する
System.out.println("Sending file : " + filename);
int totalSize = 0;
int len = 0;
for(;;){
len = fin.read(data);
totalSize += len;
out.write(data, 0, len);
if(totalSize == 4294971392L)
break;
}
fin.close();
fin = null;
System.out.println("linux.umlを送信完了しました");
socket.close();
}
}
クライアント側
import java.net.*;
import java.io.*;
public class FileTransferClientroot {
public static void main(String[] args) throws IOException{
if (args.length != 3)
throw new IllegalArgumentException("An argument should be port and filename");
String host = args[0];
int servPort = Integer.parseInt(args[1]);
String filename = args[2];
System.out.println("Output file name : " + filename);
//Create FileOutputStream
FileOutputStream fout = new FileOutputStream(filename);
//Create ServerSocket
Socket servSock = new Socket(host, servPort);
int recvMsgSize;
int bufSize = 32;
System.out.println("Size of ReceiveBuffer : " + bufSize);
byte[] byteBuffer = new byte[bufSize];
//Create InputStream
InputStream in = servSock.getInputStream();
//Read message and print it out
int totalByte = 0;
//while((recvMsgSize = in.read(byteBuffer)) != -1){
for(;;){
recvMsgSize = in.read(byteBuffer);
totalByte += recvMsgSize;
fout.write(byteBuffer,0,recvMsgSize);
if(totalByte == 4294971392L)
break;
}
System.out.println("linux.umlを受信完了しました");
servSock.close();
fout.close();
fout = null;
}
}
実行結果(サーバ側)
Connected to server
Sending file : uml-root-hardy
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at FileTransferServerroot.main(FileTransferServerroot.java:25)
実行結果(クライアント側)
Output file name : uml-root-hardy
Size of ReceiveBuffer : 32
Exception in thread "main" java.lang.IndexOutOfBoundsException
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(Unknown Source)
at FileTransferClientroot.main(FileTransferClientroot.java:28)