【Java】Socket 通信を行う ~Server側/Client側の実装例~

サンプル

Server側

SampleSoketServer.java

package com.soket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SampleSoketServer {

  public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = null;
    BufferedReader bufferedReader = null;
    PrintStream printStream = null;
    Socket clientSocket = null;

    try {
      System.out.println("Running");

      // ポート10999番を開く
      serverSocket = new ServerSocket(10999);
      
      System.out.println("ServerSocket accepting");
      
      while (true) {
        clientSocket = serverSocket.accept();
        System.out.println("ServerSocket accepted");
        
        bufferedReader =
            new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        System.out.println("Processing.");
        printStream = new PrintStream(clientSocket.getOutputStream());
        System.out.println("Processing..");
        
        String result;
        result = bufferedReader.readLine();
        System.out.println("Processing...");
        if (result != null) {
          // とりあえず、コンソール画面に吐き出してみる
          System.out.println("Received " + result);
          printStream.println("Hellow World " + result + "!!");
        }
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    } finally {
      if (clientSocket != null) {
        clientSocket.close();
      }
      if (printStream != null) {
        printStream.close();
      }
      if (bufferedReader != null) {
        bufferedReader.close();
      }
      if (serverSocket != null) {
        serverSocket.close();
      }
    }
  }
}

Client側

SampleSoketClient.java

package com.soket;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class SampleSoketClient {
  public static void main(String[] args) throws IOException {
    Socket socket = null;
    DataOutputStream dataOutputStream = null;
    BufferedReader bufferedReader = null;

    try {
      // ポート10999番を開く
      socket = new Socket("localhost", 10999);
      dataOutputStream = new DataOutputStream(socket.getOutputStream());
      bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

      if (socket != null && dataOutputStream != null && bufferedReader != null) {
        String inputData = null;
        if (args != null && args.length > 0) {
          inputData = args[0] + "\n"; // !注意! このサンプルではクライアント側の作りにより、"\n"が必須(あくまでこのサンプルでは)
        } else {
          inputData = "Mike\n"; // !注意! このサンプルではクライアント側の作りにより、"\n"が必須(あくまでこのサンプルでは)
        }
        dataOutputStream.writeBytes(inputData);

        // サーバーからのメッセージを受け取り画面に表示します
        String responseLine;
        if ((responseLine = bufferedReader.readLine()) != null) {
          System.out.println("From Server: " + responseLine);
        }
      }
    } catch (UnknownHostException ex) {
      ex.printStackTrace();
    } catch (IOException ex) {
      ex.printStackTrace();
    } finally {
      if (dataOutputStream != null) {
        dataOutputStream.close();
      }
      if (bufferedReader != null) {
        bufferedReader.close();
      }
      if (socket != null) {
        socket.close();
      }      
    }
  }
}

実行の仕方

 * Eclipse で開発していると、2つ同時にJavaプログラムを実行するのがめんどい。

手順

 [1] Eclipse で、Server側のプログラムを実行しておく(そのまま放置)

 [2] コマンドプロンプトを起動し、プロジェクトの「bin」配下まで移動する 

  cd [プロジェクトの「bin」までのパス]

 [3] コマンドプロンプトで、クライアントプログラムをjavaコマンドで実行

    ■ 例1
  java com.soket.SampleSoketClient

    => Server側とClient側のコンソール画面に「Received Mike」「From Server: Hellow World Mike」が表示

    ■ 例2
  java com.soket.SampleSoketClient Tom

    => Server側とClient側のコンソール画面に「Received Tom」「From Server: Hellow World Tom」が表示

実行時でのトラブル

手順[3]実行時でエラー「NoClassDefFoundError」が表示された場合

以下を参照のこと
http://blogs.yahoo.co.jp/dk521123/33075162.html


関連記事

Java で、SSL通信を行うには

http://blogs.yahoo.co.jp/dk521123/33122920.html

ノンブロッキングチャネル ~SocketChannel / ServerSocketChannel~

http://blogs.yahoo.co.jp/dk521123/35067257.html