ソケット通信

ソケットとは通信を行うアプリケーションの仮想的なインターフェースのことです。サーバは指定したポート番号でクライアントからの接続を待ち、クライアントはIPアドレスもしくはホスト名とポート番号を指定してサーバに接続します。接続が成功するとサーバ、クライアントともにソケットが生成され、そのソケットに対してデータ送受信を行うことができます。Curlでは、ソケットサーバ及びクライアントを実装することができます。

TCPサーバ

以下は、TCPサーバのコードサンプルです。

{let socket-server:AcceptorTCPSocket = {AcceptorTCPSocket}}
{server-socket.bind
    local-port = port,
    acceptable-handler =
        {on e:AcceptableSocketEvent do
            def socket = {server-socket.accept}
            {try 
                || receive
                {with-open-streams 
                    input-stream = {socket.to-InputStream} 
                 do
                    {print {input-stream.read allow-short-read? = true}}

                    || send 
                    {with-open-streams 
                        output-stream = {socket.to-OutputStream} 
                     do
                        {output-stream.write {make-bytes “back!”}}
                    }
                }
              finally
                {socket.close}
             }
       }

AcceptorTCPSocketクラスをnewすることによりサーバソケットを生成し、bindメソッドを実行することで、ローカルアドレスの指定したポートにバインドします。ここでbindメソッドの引数としてクライアントから受信した際に発生させるイベントAcceptableSocketEventをacceptable-handler引数にセットします。ここでは、受信した場合にクライアントから送信されたストリームデータを文字列として表示し、結果をOutputStreamとして返しています。

TCPクライアント

以下は、TCPクライアントのコードサンプルです。

let socket:DataTCPSocket =
    {DataTCPSocket remote-port = port, remote-name = hostname}
{try
    {socket.connect}
    || send
    {with-open-streams 
        output-stream = {socket.to-OutputStream} 
     do
        {output-stream.write {make-bytes “send!”}}

        || receive
        {with-open-streams
            input-stream = {socket.to-InputStream} 
         do
            {print {input-stream.read allow-short-read? = true}}
        }
    }
 finally
    {socket.close}
}

DataTCPSocketクラスを用いてクライアントソケットを生成し、connectメソッドにてサーバに接続します。サーバにデータを送信するには、ソケットのto-OutputStreamメソッドでOutputStreamを生成し、データを書き込みます(writeメソッド)。また、サンプルでは、サーバからのレスポンスをソケットのto-InputStreamメソッドによりInputStreamを受け取り、コンソールに出力しています。ソケットを閉じるにはcloseメソッドを利用します。

また、CurlではUDPサーバ及びクライアントも取り扱うことができますし、非同期通信も可能となっています。詳細はCurlのヘルプをご確認ください。

コードサンプルのダウンロード

ソケット通信のサンプル