Javaを用いてファイル転送プログラムを作成しています。
http://d.hatena.ne.jp/rintaromasuda/20060327/114 …
を参考に作成したのですが、うまく転送できません。
プログラムは以下の通り。
◎サーバ側
import java.net.*;
import java.io.*;
public class UMLFileServer {
public static void main(String[] args) throws IOException{
if (args.length != 2)
throw new IllegalArgumentException("An argument should be port and filename");
int servPort = Integer.parseInt(args[0]);
String filename = args[1];
System.out.println("Output file name : " + args[1]);
//Create FileOutputStream
FileOutputStream fout = new FileOutputStream(filename);
//Create ServerSocket
ServerSocket servSock = new ServerSocket(servPort);
int recvMsgSize;
//int bufSize = servSock.getReceiveBufferSize();
int bufSize = 32;
System.out.println("Size of ReceiveBuffer : " + bufSize);
//Socket accepting loop
while(true){
System.out.println("Wait for accepting... ");
Socket clntSock = servSock.accept();
byte[] byteBuffer = new byte[bufSize];
System.out.println("Accepted client at " +
clntSock.getInetAddress().getHostAddress() +
" on port " +
clntSock.getPort());
//Create InputStream
InputStream in = clntSock.getInputStream();
//Read message and print it out
int totalByte = 0;
while((recvMsgSize = in.read(byteBuffer)) != -1){
System.out.println("Message : " + new String(byteBuffer,0,recvMsgSize));
System.out.println("Size : " + recvMsgSize);
//Write to file
totalByte = totalByte + recvMsgSize;
fout.write(byteBuffer,0,recvMsgSize);
}
System.out.println("Recieved file size : " + totalByte);
clntSock.close();
fout.close();
fout = null;
}
}
}
◎クライアント側
import java.net.*;
import java.io.*;
public class UMLFileClient {
public static void main(String[] args) throws IOException{
if (args.length != 3)
throw new IllegalArgumentException("Arguments should be host,port and filepath");
String server = args[0];
int serverPort = Integer.parseInt(args[1]);
String filename = args[2];
byte[] data = new byte[32];
//ソケットの作成
Socket socket = new Socket(server,serverPort);
System.out.println("Connected to server");
//ストリームの作成
FileInputStream fin = new FileInputStream(filename);
OutputStream out = socket.getOutputStream();
//ファイルの内容を読み出し、送信する
System.out.println("Sending file : " + filename);
int totalSize = 0;
int len = 0;
while ((len = fin.read(data)) != -1) {
totalSize = totalSize + len;
System.out.println(new String(data,0,len));
out.write(data, 0, len);
}
fin.close();
fin = null;
System.out.println("size of file : " + totalSize);
socket.close();
}
}
◎実行結果
Output file name : hiroyasu.txt
Size of ReceiveBuffer : 32
Wait for accepting...
Accepted client at 192.168.71.104 on port 36608
Recieved file size : 0
Wait for accepting...
以上です。どなたか解決方法をご教授ください。
No.2ベストアンサー
- 回答日時:
例えば必ず最初の4バイトはデータ長を送信して、それに続いて(指定データ長分の)データを送信するとしておいて、受信側は、まず4バイトを受信して、データ長を解析して、実際のデータを受信します。
尚、余計なお世話かもしれませんが、バイナリデータとして送信するならバイトオーダに注意してください。バイトオーダが分からないようであれば、データ長を固定長の文字列表現で送るほうが簡単かもしれません。
No.1
- 回答日時:
とりあえず貼り付けてあるプログラムを動かしてみたのですが、私の環境だと正しく動作するみたいです。
考えられるのは、
1.送信側がファイルから0バイトしか読み込めてない
一応確認のため :-)
2.受信途中で in.read() が -1 を返してきている
固定バイト数を送受信するまで必ず待つようにしてみて受信できるか試す。
ぐらいですかねぇ。
パケットキャプチャとかでTCP/IPレベルで確認したら、もう少しなにか分かるかもしれませんねぇ。
この回答への補足
お返事ありがとうございます。
>2.受信途中で in.read() が -1 を返してきている
>固定バイト数を送受信するまで必ず待つようにしてみて受信できるか試す。
ソケットを閉じずにできれば操作完了したいと考えているのですが、
固定バイト数を送受信するためには、どのようなコードが必要でしょうか。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
C言語のポインターに関する警告
-
ファイル名に変数を使う(Java)
-
vb6 オブジェクトライブラリは...
-
JAVAのDouble型の小数点以下の...
-
LC発振回路-ループ利得
-
サーブレットで文字化け
-
構文解析中にファイルの終わり...
-
java教えてください。
-
java の最大数と最小数の足し方...
-
改行の判定方法
-
Javaのプログラムがどうしても...
-
プログラミング演習エラーについて
-
Javaのコマンドライン引数を使...
-
Javaでファイル転送プログラム
-
ダブルクォーテーションのrepla...
-
System.err. printlnとSystem.o...
-
ORA-01858: 数値を指定する箇所...
-
IF関数でEmpty値を設定する方法。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
C言語のポインターに関する警告
-
EclipseでJava
-
LC発振回路-ループ利得
-
改行の判定方法
-
JAVAのDouble型の小数点以下の...
-
文字列の引き算
-
java シンボルが見つかりません...
-
エクセルマクロ文で、赤文字セ...
-
vb6 オブジェクトライブラリは...
-
構文解析中にファイルの終わり...
-
「続行するには何かキーを押し...
-
java int integer
-
Javaのプログラムがどうしても...
-
JAVAでの占い
-
nullcline
-
Javaのコマンドライン引数を使...
-
JAVA 文字色変更
-
Javaでカレントディレクトリを...
おすすめ情報