ソケット通信でファイル転送をするプログラムを作ってみようと試みている。とりあえず手始めとして、簡単な文字列を送るプログラムを作ってみた。本日はファイル転送までは手が回らず。
クライアント側のソースは以下。引数として、サーバのアドレスと、サーバ側プログラムが使用するポート番号、送信する文字列を指定する。
import java.net.*; import java.io.*; public class FileTranClient { public static void main(String[] args) throws IOException{ if (args.length != 3) throw new IllegalArgumentException("Arguments should be host,port and message"); String server = args[0]; int serverPort = Integer.parseInt(args[1]); byte[] byteBuffer = args[2].getBytes(); //Create Socket Socket socket = new Socket(server,serverPort); System.out.println("Connected to server"); //Create OutputStream OutputStream out = socket.getOutputStream(); out.write(byteBuffer); System.out.println("sent message : " + args[2]); socket.close(); } }
サーバ側のソースは以下。引数として、このプログラムが実行されるポート番号を指定する。
import java.net.*; import java.io.*; public class FileTranServer { public static void main(String[] args) throws IOException{ if (args.length != 1) throw new IllegalArgumentException("An argument should be port"); int servPort = Integer.parseInt(args[0]); //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 while((recvMsgSize = in.read(byteBuffer)) != -1){ System.out.println("Message : " + new String(byteBuffer,0,recvMsgSize)); System.out.println("Size : " + recvMsgSize); } clntSock.close(); } } }
サーバ側にて、
//int bufSize = servSock.getReceiveBufferSize(); int bufSize = 32;
としてるところがポイントで、クライアント側から送られてきた文字列を1回32バイトずつ読み込むようにしてみた。ちなみにコメントアウトされてるほうでbufSizeを宣言すると、8192バイトずつ読み込まれるようになった。これはおそらく、僕のPCのデフォルト値なのだろう。
送信するメッセージは、以下の105バイトの文字列とした。
TokyoNagoyaOsakaNewYorkFukuokaSeoulSapporoSeattleLosAngelesChibaYokohamaKyotoNaraParisFlorenceAkitaAomori
以下に実行結果を示す。
クライアント側の実行結果。
Connected to server sent message : TokyoNagoyaOsakaNewYorkFukuokaSeoulSapporoSeattleLosAngelesChibaYokohamaKyotoNaraParisFlorenceAkitaAomori
サーバ側の実行結果。
Size of ReceiveBuffer : 32 Wait for accepting... Accepted client at 127.0.0.1 on port 1045 Message : TokyoNagoyaOsakaNewYorkFukuokaSe Size : 32 Message : oulSapporoSeattleLosAngelesChiba Size : 32 Message : YokohamaKyotoNaraParisFlorenceAk Size : 32 Message : itaAomori Size : 9 Wait for accepting...
32バイトずつ文字列が読み取られている様子が目にみえた。次回はこれを改良し、ファイルの転送にまで繋げたい。おそらくファイルストリームとかいうやつを使うことで出来るのではないか。
今回Javaを勉強しているのだが、ネットワークなどについても何も知らないことに気付かされる。勉強しないとなぁ。
以下が参考にしている書籍。非常にわかり易く解説されていると思う。実例から理論的な説明まで載っているし、何より薄くて扱い易いところが○。大学の教科書として書かれたようで、手始めには適していると思う。ただファイル転送に関する話は載っていないようなので、また情報を探さないと。

- 作者: Kenneth L. Calvert,Michael J. Donahoo,小高知宏
- 出版社/メーカー: オーム社
- 発売日: 2003/05/01
- メディア: 単行本
- 購入: 2人 クリック: 36回
- この商品を含むブログ (10件) を見る