|
||||||||||||||||||||||
|
ソケットの読み込みと書き込みここまでで、テキストファイル、バイナリファイル、 オブジェクトのシリアライズとデシリアライズをみてきました。 最初はナントカストリームとか、カントカリーダー・ライターとか、いろいろと紛らわしかったかもしれませんが、だいぶ慣れてきたのではないでしょうか。 ここではついでに調子にのって、ソケットでも同じことができることをみてみようと思います。 ソケットについてはまた別の機会に詳しく説明することにしますが、ここでは簡単なサーバーとクライアントを作ってネットワーク上のデータの受け渡しをしてみましょう。 ServerSocketサーバーのコードはこの通り。 package com.keicode.java.test;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTestServer {
public static void main(String[] args) {
try {
System.out.println("--- Start Server ---");
System.out.println("Listening on 0xbeef");
ServerSocket serverSocket = new ServerSocket(0xbeef);
Socket socket = serverSocket.accept();
System.out.println("Accept returned!");
DataInputStream inStream =
new DataInputStream(socket.getInputStream());
int i;
while( (i = inStream.read()) != -1 ){
System.out.print("Read one character...");
if( i == 'x' ){
System.out.println("x! break read-loop.");
break;
}
if(0x1f<i && i<0x7e){
System.out.println((char)i);
}
}
inStream.close();
System.out.println("--- Exit Server. Bye! ---");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
サーバー側は ServerSocket の 127.0.0.1 のポート 0xbeef で接続を待ちます。 accept メソッドで接続を待ち、ストリームからデータを読み文字データを出力します。文字 'x' を受け取ったらストリームをブチ切りして処理を終了します。 クライアント側クライアント側は次のとおり。 package com.keicode.java.test;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTestClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 0xbeef);
DataOutputStream outStream = new DataOutputStream(
socket.getOutputStream());
outStream.write('H');
outStream.write('e');
outStream.write('l');
outStream.write('l');
outStream.write('o');
outStream.write('!');
outStream.write('x'); // Beef Protocol :-)
outStream.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
同じく 127.0.0.1 の 0xbeef に接続して、その出力ストリームに対して Hello!x を送ります。 サーバー側はこれを受け取って、最後の x がきたところで読み込みループを終了して、接続をブチ切る予定です。 これを実際に動かした結果は次のようになりました。 まずサーバーを起動。accept で接続待ちになります。
ここでクライアントを起動。クライアントは起動したら直ちにソケットに対して Hello!x を送り、サーバーはそれを受け取ったら 標準出力に出力。x を受け取ったら終了します。
実際に思ったように動作しました。 |
|
© 2010 Java 入門 |
|||||||||||||||||||