JavaA2Z

KAB-studio > プログラミング > JavaA2Z > ソケットとは

ソケット

日本語 接続口
英語 socket
ふりがな そけっと
フリガナ ソケット

解説

ネットワークの「接続口」のこと。
ネットワーク接続をう際に、接続されたマシンの「ネットワークに接続している部分」を「ソケット」と言う。
ただし、ハードウェア的な物を指すのではなく、あくまでソフトウェア的な、いわば「仮想の接続口」を意味する。
マシンを示す「IPアドレス」と、接続番号を示す「ポート番号」を情報として持ち、他のマシンとネットワークを経由して情報の交換をう。
 
狭義には、ネットワーク通信をAPIの総称。
一般のネットワーク接続において「ソケット」という呼称を使うことは希であり、「ソケット」と言えば通常はプログラミング用語であり、プログラムでネットワーク通信をうためのAPIを指すことが多い。
 
JavaではSocketクラスを始めとするクラスがソケットに関係したクラスとなる。
クライアント側は、Socketクラスコンストラクタで接続先のIPアドレスもしくはホスト名を第1引数に、ポート番号を第2引数に渡すことで接続することができる。
サーバー側は、ServerSocketクラスコンストラクタポート番号を指定し、accept()メソッドで待機を開始する。接続時に戻り値としてSocketクラスが返されるため、このSocketクラスでデータの入出力をう。
SocketクラスのgetInputStream()メソッドで入力用ストリームを、getOutputStream()メソッドで出力用ストリームを取得できる。クライアント側、サーバー側とも、このストリームを使用して入出力をう。
Socketクラス、ServerSocketクラスストリームは終了時にclose()メソッドを呼び終了処理をう必要がある。
 
ただし、SocketクラスTCPによる通信のみうことができる。
UDPの場合はDatagramSocketクラスを使用する。
 
ソケット、特にTCPによる通信は、処理を直接うため、HTTPやSMTP等のプロトコルに合わせて処理をう必要がある。
たとえばHTTPであればHttpURLConnectionクラスのように、簡単に特定のプロトコルの処理をうためのクラスが存在するため、ソケットを使用するのは「独自のプロトコルを用いる」「有名ではないプロトコルを用いる」「特別な処理をいたい」といった場合に限られるだろう。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
import java.net.Socket;
import java.net.ServerSocket;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        // ポート番号12345で通信します。
        // ……もし、ポート番号12345が空いてないとダメです。
        // その場合はこの数字を他のにしてください。
        final int PORT = 12345;

        // サーバーは別スレッドで。
        // もちろん、普通は「別のプログラム」をサーバーにします。
        ServerThread thread = new ServerThread( PORT );
        thread.start();

        try
        {
            // このスレッドを3秒止めます。
            // サーバー側の準備ができるのを待つためです。
            Thread.sleep( 3 * 1000 );
        }
        catch( InterruptedException e )
        {
            // sleep()メソッドを呼んでいる間に割り込みが入ると
            // InterruptedException例外が投げられます。
            e.printStackTrace();
        }

        // 以下、クライアント側の処理。

        // finallyでclose()するためここで宣言します。
        OutputStreamWriter outputStreamWriter = null;
        Socket socket = null;
        try
        {
            // このマシンの、PORTのポート番号でアクセスします。
            socket = new Socket( "localhost", PORT );

            // サーバーに文字列を出力するためのストリームを取得します。
            outputStreamWriter = new OutputStreamWriter( socket.getOutputStream() );

            // 文字列をサーバー側に出力します。
            System.out.println( "[クライアント]「あいうえお」を出力します。" );
            outputStreamWriter.write( "あいうえお", 0, 5 );
            outputStreamWriter.flush();
            System.out.println( "[クライアント]「あいうえお」を出力しました。" );
            // [サーバー]待機開始!
            // [サーバー]待機終了。
            // [サーバー]出力開始。
            // [クライアント]「あいうえお」を出力します。
            // あ
            // い
            // う
            // え
            // お
            // [クライアント]「あいうえお」を出力しました。
            // [サーバー]出力完了。
        }
        catch( IOException e )
        {
            // 出力時に問題があったらIOException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if( outputStreamWriter != null )
                {
                    outputStreamWriter.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // ソケットを閉じます。
            try
            {
                if( socket != null )
                {
                    socket.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}

/**
*   サーバー側。
*/
class ServerThread extends Thread
{
    /** ポート番号 */
    private int port;

    /**
    *   コンストラクタ。
    */
    public ServerThread( int port )
    {
        this.port = port;
    }
    
    /**
    *   サーバーを起動します。
    */
    public void run()
    {
        // finallyでclose()するためここで宣言します。
        Socket socket = null;
        ServerSocket serverSocket = null;
        InputStreamReader inputStreamReader = null;
        try
        {
            // サーバーを作ります。
            serverSocket = new ServerSocket( port );

            // クライアントからのアクセスを待機開始!
            System.out.println( "[サーバー]待機開始!" );
            socket = serverSocket.accept();
            System.out.println( "[サーバー]待機終了。" );

            // クライアントから送られてきた文字列を受け取る
            // ストリームを用意します。
            inputStreamReader = new InputStreamReader( socket.getInputStream() );

            // 文字を出力します。
            System.out.println( "[サーバー]出力開始。" );
            while( true )
            {
                // read()メソッドで1文字取得します。
                int i = inputStreamReader.read();
                if( i == -1 )
                {
                    // -1が来たら終了です。
                    break;
                }

                // 文字として出力します。
                System.out.println( (char)i );
            }
            System.out.println( "[サーバー]出力完了。" );
        }
        catch( IOException e )
        {
            // 出力時に問題があったらIOException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if( inputStreamReader != null )
                {
                    inputStreamReader.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // ソケット2とも閉じます。
            try
            {
                if( serverSocket != null )
                {
                    serverSocket.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            try
            {
                if( socket != null )
                {
                    socket.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}
// Sample.java
import java.net.Socket;
import java.net.ServerSocket;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        // ポート番号12345で通信します。
        // ……もし、ポート番号12345が空いてないとダメです。
        // その場合はこの数字を他のにしてください。
        final int PORT = 12345;

        // サーバーは別スレッドで。
        // もちろん、普通は「別のプログラム」をサーバーにします。
        ServerThread thread = new ServerThread( PORT );
        thread.start();

        try
        {
            // このスレッドを3秒止めます。
            // サーバー側の準備ができるのを待つためです。
            Thread.sleep( 3 * 1000 );
        }
        catch( InterruptedException e )
        {
            // sleep()メソッドを呼んでいる間に割り込みが入ると
            // InterruptedException例外が投げられます。
            e.printStackTrace();
        }

        // 以下、クライアント側の処理。

        // finallyでclose()するためここで宣言します。
        OutputStreamWriter outputStreamWriter = null;
        Socket socket = null;
        try
        {
            // このマシンの、PORTのポート番号でアクセスします。
            socket = new Socket( "localhost", PORT );

            // サーバーに文字列を出力するためのストリームを取得します。
            outputStreamWriter = new OutputStreamWriter( socket.getOutputStream() );

            // 文字列をサーバー側に出力します。
            System.out.println( "[クライアント]「あいうえお」を出力します。" );
            outputStreamWriter.write( "あいうえお", 0, 5 );
            outputStreamWriter.flush();
            System.out.println( "[クライアント]「あいうえお」を出力しました。" );
            // [サーバー]待機開始!
            // [サーバー]待機終了。
            // [サーバー]出力開始。
            // [クライアント]「あいうえお」を出力します。
            // あ
            // い
            // う
            // え
            // お
            // [クライアント]「あいうえお」を出力しました。
            // [サーバー]出力完了。
        }
        catch( IOException e )
        {
            // 出力時に問題があったらIOException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if( outputStreamWriter != null )
                {
                    outputStreamWriter.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // ソケットを閉じます。
            try
            {
                if( socket != null )
                {
                    socket.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}

/**
*   サーバー側。
*/
class ServerThread extends Thread
{
    /** ポート番号 */
    private int port;

    /**
    *   コンストラクタ。
    */
    public ServerThread( int port )
    {
        this.port = port;
    }
    
    /**
    *   サーバーを起動します。
    */
    public void run()
    {
        // finallyでclose()するためここで宣言します。
        Socket socket = null;
        ServerSocket serverSocket = null;
        InputStreamReader inputStreamReader = null;
        try
        {
            // サーバーを作ります。
            serverSocket = new ServerSocket( port );

            // クライアントからのアクセスを待機開始!
            System.out.println( "[サーバー]待機開始!" );
            socket = serverSocket.accept();
            System.out.println( "[サーバー]待機終了。" );

            // クライアントから送られてきた文字列を受け取る
            // ストリームを用意します。
            inputStreamReader = new InputStreamReader( socket.getInputStream() );

            // 文字を出力します。
            System.out.println( "[サーバー]出力開始。" );
            while( true )
            {
                // read()メソッドで1文字取得します。
                int i = inputStreamReader.read();
                if( i == -1 )
                {
                    // -1が来たら終了です。
                    break;
                }

                // 文字として出力します。
                System.out.println( (char)i );
            }
            System.out.println( "[サーバー]出力完了。" );
        }
        catch( IOException e )
        {
            // 出力時に問題があったらIOException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if( inputStreamReader != null )
                {
                    inputStreamReader.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // ソケット2とも閉じます。
            try
            {
                if( serverSocket != null )
                {
                    serverSocket.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            try
            {
                if( socket != null )
                {
                    socket.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/10/14
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。