ソケット通信でファイル転送その1

ソケット通信でファイル転送をするプログラムを作ってみようと試みている。とりあえず手始めとして、簡単な文字列を送るプログラムを作ってみた。本日はファイル転送までは手が回らず。

クライアント側のソースは以下。引数として、サーバのアドレスと、サーバ側プログラムが使用するポート番号、送信する文字列を指定する。

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を勉強しているのだが、ネットワークなどについても何も知らないことに気付かされる。勉強しないとなぁ。

以下が参考にしている書籍。非常にわかり易く解説されていると思う。実例から理論的な説明まで載っているし、何より薄くて扱い易いところが○。大学の教科書として書かれたようで、手始めには適していると思う。ただファイル転送に関する話は載っていないようなので、また情報を探さないと。

TCP/IPソケットプログラミング Java編

TCP/IPソケットプログラミング Java編