Java ソケット通信のサンプル

Javaのソケット通信のサンプルです。

目次

サンプル ソケット通信とは
  サンプルコードの説明
  サーバー側のコード
  クライアント側のコード
  実行して確認する

ソケット通信とは

  • IPアドレスとポート番号で通信します
  • サーバー側は待ち状態で起動します
  • クライアント側はサーバー側に接続しに行きます
  • サーバー側はクライアント側から要求を受けて処理をします

サンプルコードの説明

サーバー側とクライアント側のコードがあります。
クライアント側で、
偶数の数値を入力するとサーバーは「OK」を返します。
奇数の数値を入力するとサーバーは「NG」を返します。
数値以外を入力するとメッセージを返します。
byeと入力するとサーバー側とクライアント側の処理が終了します。

サーバー側のコード

ファイル名はTest1.javaです。

package test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * ソケット通信(サーバー側)
 */
class Sample1 {
	
	void runSample() {

	ServerSocket sSocket = null;
	Socket socket = null;
	BufferedReader reader = null;
	PrintWriter writer = null;
	
	try{
		//IPアドレスとポート番号を指定してサーバー側のソケットを作成
		sSocket = new ServerSocket();
		sSocket.bind(new InetSocketAddress
				("127.0.0.1",8765));
	
		System.out.println("クライアントからの入力待ち状態");
		
		//クライアントからの要求を待ち続けます
		socket = sSocket.accept();
		
		//クライアントからの受取用
		reader = new BufferedReader(
				new InputStreamReader
				(socket.getInputStream()));
		
		//サーバーからクライアントへの送信用
		writer = new PrintWriter(
				socket.getOutputStream(), true);
		
		//無限ループ byeの入力でループを抜ける
		String line = null;
		int num;
        while (true) {
        	
        	line = reader.readLine();
        	
        	if (line.equals("bye")) {
                break;
        	}
        	
        	try{
        		num = Integer.parseInt(line);
	        			
	        	if(num%2==0){
	            	//送信用の文字を送信
	                writer.println("OK");        		
	        	}else{
	            	//送信用の文字を送信
	                writer.println("NG");
	        	}
        	}catch(NumberFormatException e){
        		//送信用の文字を送信
                writer.println("数値を入力して下さい");
        	}

            System.out.println("クライアントで入力された文字=" + line);
        }			
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		try{
			if (reader!=null){
				reader.close();
			}
			if (writer!=null){
				writer.close();
			}
			if (socket!=null){
				socket.close();
			}
			if (sSocket!=null){
				sSocket.close();
			}
            System.out.println("サーバー側終了です");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	}
}

public class Test1 {
	public static void main(String[] args) {
		Sample1 s1 = new Sample1();
		s1.runSample();
	}
}

クライアント側のコード

ファイル名はTest2.javaです。

package test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * ソケット通信(クライアント側)
 */
class Sample2 {
	void runSample() {

	Socket cSocket = null;
	BufferedReader csInput = null;
	PrintWriter writer = null;
	BufferedReader reader = null;

	try{
		//IPアドレスとポート番号を指定してクライアント側のソケットを作成
		cSocket = new Socket("127.0.0.1", 8765);

		//クライアント側での入力用
		csInput = new BufferedReader
				(new InputStreamReader(System.in));
		
		//クライアント側からサーバへの送信用
		writer = new PrintWriter
				(cSocket.getOutputStream(), true);
		
		//サーバ側からの受取用
		reader = new BufferedReader
				(new InputStreamReader
						(cSocket.getInputStream()));

		//無限ループ byeの入力でループを抜ける
		String line = null;
		while (true) {
			System.out.println("-------------------");
			System.out.println("偶数の数値を入力して下さい");
			System.out.println("-------------------");

        	line = csInput.readLine();
        	
			//送信用の文字を送信
			writer.println(line);
			
			//byeの入力でループを抜ける
			if (line.equals("bye")) {
				break;
			}
			
			//サーバ側からの受取の結果を表示
			System.out.println
				("サーバーからの回答:" + reader.readLine());
		}
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		try {
			if (reader != null) {
				reader.close();
			}
			if (writer != null) {
				writer.close();
			}
			if (csInput != null) {
				csInput.close();
			}
			if (cSocket != null) {
				cSocket.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
        System.out.println("クライアント側終了です");
	}
	}
}
public class Test2 {
	public static void main(String[] args) {
		Sample2 s2 = new Sample2();
		s2.runSample();
	}
}

実行して確認する

1.コマンドプロンプトでソースコードをコンパイルします。
例:ソースコードをDドライブのtest1フォルダ配下にTest1.javaとTest2.javaを配置した場合

D:¥>javac /test1/Test1.java
D:¥>javac /test1/Test2.java

2.コマンドプロンプトを2つ立ち上げ、先にサーバー側のTest1をjavaコマンドで実行し、次にクライアント側のTest2をjavaコマンドで実行します。

D:¥>java test1.Test1
D:¥>java test1.Test2

3.以下はクライアント側での実行結果です

以下はサーバー側の実行結果です。

関連の記事

Java HTTP通信のサンプル(HttpURLConnection)
Java HTTP通信のサンプル(HttpClient)

△上に戻る