|
| |
2002/02/03 田中宏和 |
| Last Update
2002/12/03 |
|
 |
ソケット編 |
 |
◆ソケットとは? |
| ソケットとは通信を行うアプリケーションの仮想的なインターフェースのことです。サーバーはポート番号を指定してクライアントからの接続を待って、クライアントはサーバーのアドレスとポート番号を指定してサーバーに接続します。接続が成功するとサーバー、クライアントともにソケットが作られ、そのソケットに対してデータを読み書きすることによって簡単にデータのやりとりを行うことができます。 |
| ◆ここでの環境 |
| OS |
Windows 2000 |
| J2SE SDK |
1.4.0 |
|
|
|
| ◆環境の構築 |
| アプリケーション編を参考にしてJava実行環境を構築してください。 |
| ◆サーバー側ソースコード |
| まずサーバー側のプログラムを作成したいと思います。このサーバーアプリケーションはクライアントから送られてきた文字列をそのまま送り返す簡単なアプリケーションです。 |
| HelloWorldSocketServer.java(ここからダウンロード) |
import java.net.*;
import java.io.*;
public class HelloWorldSocketServer {
public static void main(String[] args) {
try{
// サーバーソケットの生成
ServerSocket serverSocket = new ServerSocket(5555);
System.out.println("クライアントからの接続をポート5555で待ちます");
// クライアントからの接続を待ちます
Socket socket = serverSocket.accept();
System.out.println(socket.getInetAddress() + "から接続を受付ました");
// 出力ストリームを取得
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 入力ストリームを取得
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
// 読み込んだ行をそのまま出力ストリームに書き出す
String inputLine;
while ((inputLine = in.readLine()) != null) {
out.println(inputLine);
}
System.out.println("処理が終了したので接続を切ります");
// 入出力ストリームを閉じる
out.close();
in.close();
// ソケットを閉じる
socket.close();
// サーバーソケットを閉じる
serverSocket.close();
} catch(IOException e){
e.printStackTrace();
}
}
} |
|
|
| |
| ◆クライアント側ソースコード |
| 次にクライアント側のプログラムを作成します。このクライアントアプリケーションは「Hello World」という文字列をサーバーに送って帰ってきたデータを表示するものです。
|
| HelloWorldSocketClient.java(ここからダウンロード) |
import java.net.*;
import java.io.*;
public class HelloWorldSocketClient {
public static void main(String[] args){
try{
// ソケットを生成
Socket socket = new Socket("localhost", 5555);
// 出力ストリームを取得
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 入力ストリームを取得
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
// 「Hello World」をサーバーに送る
out.println("Hello World");
// 読み込んだデータを表示
System.out.println(in.readLine());
// 入出力ストリームを閉じる
out.close();
in.close();
// ソケットを閉じる
socket.close();
} catch(IOException e){
e.printStackTrace();
}
}
} |
|
|
| |
| ◆コンパイル |
| コマンドプロンプト |
| C:\JavaHello\Socket>javac
HelloWorldSocketServer.java HelloWorldSocketClient.java
C:\JavaHello\Socket> |
|
| ◆サーバーアプリケーションの実行 |
| まずサーバーアプリケーションを実行します。 |
| コマンドプロンプト |
C:\JavaHello\Socket>java
HelloWorldSocketServer
クライアントからの接続をポート5555で待ちます
|
|
| カーソルが点滅状態になり、クライアントからの接続を待っている状態になります。 |
| ◆クライアントアプリケーションの実行 |
| 新しいコマンドプロンプトを立ち上げてクライアントアプリケーションを実行します。 |
| コマンドプロンプト |
| C:\JavaHello\Socket>java
HelloWorldSocketClient
Hello World
C:\JavaHello\Socket> |
|
| おおお!サーバーから「Hello World」が帰ってきましたね! |
| |
| ◆サーバー側のマルチスレッド化 |
| 上記の例だと1回サーバーに接続があるとサーバーのプログラムが終了してしまいますので、何回もクライアントから接続があっても送られてきたメッセージを返し続けるように修正します。 |
| ■サーバー側ソースコード |
| HelloWorldMultiThreadServer.java(ここからダウンロード) |
import java.io.*;
import java.net.*;
import java.util.*;
public class HelloWorldMultiThreadServer {
public static void main(String argv[]) {
try {
// サーバーソケットの生成
ServerSocket serverSocket = new ServerSocket(5555);
// メインループ
while(true) {
try {
System.out.println("クライアントからの接続をポート5555で待ちます");
// クライアントからの接続を待ちます
Socket socket = serverSocket.accept();
System.out.println(socket.getInetAddress() + "から接続を受付ました");
// 処理をスレッドに任せます
new Connect(socket);
} catch (Exception ex) {
ex.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Connect extends Thread {
private Socket socket = null;
public Connect(Socket socket) {
this.socket = socket;
// スレッド開始
this.start();
}
public void run() {
try {
// 出力ストリームを取得
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 入力ストリームを取得
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
// 読み込んだ行をそのまま出力ストリームに書き出す
String inputLine;
while ((inputLine = in.readLine()) != null) {
out.println(inputLine);
}
System.out.println("処理が終了したので接続を切ります");
// 入出力ストリームを閉じる
in.close();
out.close();
// ソケットを閉じる
socket.close();
} catch(Exception e) {
try {
socket.close();
}catch(Exception ex) {
e.printStackTrace();
}
}
}
} |
|
|
| |
| ■コンパイル |
| コマンドプロンプト |
| C:\JavaHello\Socket>javac
HelloWorldMultiThreadServer.java
C:\JavaHello\Socket> |
|
| ■サーバーの実行 |
| コマンドプロンプト |
| C:\JavaHello\Socket>java
HelloWorldMultiThreadServer
クライアントからの接続をポート5555で待ちます |
|
| ■クライアントの実行 |
| コマンドプロンプト |
| C:\JavaHello\Socket>java
HelloWorldSocketClient
Hello World
C:\JavaHello\Socket>java HelloWorldSocketClient
Hello World
C:\JavaHello\Socket>java HelloWorldSocketClient
Hello World
C:\JavaHello\Socket>java HelloWorldSocketClient
Hello World |
|
| おおおお!何度実行してもメッセージが帰ってきますね! |
| |
■関連
FTP編 スレッド編
データグラム編 |
■書籍
Java関連の書籍 |
|
| |
|
| |
| ツールの部屋
- Java関連の書籍 - デザインパターン - 情報交換掲示板
- HOME |