JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > ソケット編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  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