モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)
目次目次を開く/閉じる

Java:簡単なソケットプログラミング

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2013/08/14
最終更新最終更新
2015/12/18
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    筋トレ始めました。バックエンドエンジニアです。

    0
    ステッカーを贈るとは?

    TCP/IP

    クラスライブラリjava.net.ServerSocketおよびjava.net.Socketを利用すると、サーバーサイドおよびクライアントサイドのTCP/IP通信が実装できます。一般にTCPは信頼性が高く通信のオーバーヘッドは大きいです。

    UDP/IP

    クラスライブラリjava.net.DatagramSocketおよびjava.net.DatagramPacketを利用すると、サーバーサイドおよびクライアントサイドのUDP/IP通信が実装できます。一般にUDPは信頼性が低く通信のオーバーヘッドは小さいです。ビデオストリーミングなど、多少のパケットロスが問題にならない通信等で利用されます。

    TCP/IP通信

    以下のサンプルプログラムでは、クライアントが送信した数値を受信したサーバーは、それを2乗してクライアントに返します。

    サーバーサイド

    Server.java

    import java.net.ServerSocket;
    import java.net.Socket;
    import java.io.InputStream;
    import java.io.DataInputStream;
    import java.io.OutputStream;
    import java.io.DataOutputStream;
    
    class Server {
        public static void main(String args[]) {
            try {
                int port = Integer.parseInt(args[0]); //サーバ側の待受ポート番号
                ServerSocket ss = new ServerSocket(port);
    
                while(true) {
                    Socket s = ss.accept(); //クライアントからの通信開始要求が来るまで待機
    
                    // 以下、クライアントからの要求発生後
                    InputStream is = s.getInputStream(); //クライアントから数値を受信
                    DataInputStream dis = new DataInputStream(is);
                    int req = dis.readInt();
    
                    OutputStream os = s.getOutputStream(); //二乗した結果を送信
                    DataOutputStream dos = new DataOutputStream(os);
                    dos.writeInt(req*req);
    
                    // ストリームを閉じる
                    dos.close();
                    dis.close();
                }
            }
            catch(Exception e) {
                System.out.println("Exception: " + e);
            }
        }
    }
    

    クライアントサイド

    Client.java

    import java.net.Socket;
    import java.io.InputStream;
    import java.io.DataInputStream;
    import java.io.OutputStream;
    import java.io.DataOutputStream;
    
    class Client {
        public static void main(String args[]) {
            try {
                String server = args[0];
                int port = Integer.parseInt(args[1]); //サーバー側のポート番号
                Socket s = new Socket(server, port);
    
                // サーバーに数値を送信
                OutputStream os = s.getOutputStream();
                DataOutputStream dos = new DataOutputStream(os);
                dos.writeInt(Integer.parseInt(args[2]));
    
                // 演算結果を受信
                InputStream is = s.getInputStream();
                DataInputStream dis = new DataInputStream(is);
                int res = dis.readInt();
                System.out.println(res);
    
                // ストリームを閉じる
                dis.close();
                dos.close();
            }
            catch (Exception e) {
                System.out.println("Exception: " + e);
            }
        }
    }
    

    実行例

    サーバーサイド (2乗した結果を返します)

    $ javac Server.java && java Server 8888
    

    クライアントサイド

    $ javac Client.java && java Client localhost 8888 7
    49
    

    UDP/IP通信

    クライアントから受信した文字列をサーバー側で表示します。

    サーバーサイド

    Server.java

    import java.net.DatagramSocket;
    import java.net.DatagramPacket;
    
    class Server {
        public static void main(String args[]) {
            try {
                int port = Integer.parseInt(args[0]); //サーバー側の待受ポート番号
                DatagramSocket ds = new DatagramSocket(port);
    
                byte buffer[] = new byte[32]; //受信データを書き込むためのバッファ
                while(true) {
                    // 受信したデータは実際にはbufferに格納される
                    DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
                    ds.receive(dp); //受信するまで待機
    
                    // 以下、受信後
                    byte received[] = new byte[dp.getLength()];
                    byte tmp[] = dp.getData(); //32バイト (buffer.length)
                    for(int i=0; i<dp.getLength(); ++i) received[i]=tmp[i];
    
                    // 文字列化して出力
                    String str = new String(received);
                    System.out.println(str);
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    クライアントサイド

    Client.java

    import java.net.DatagramSocket;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    
    class Client {
        public static void main(String args[]) {
            try {
                InetAddress addr = InetAddress.getByName(args[0]);
                int port = Integer.parseInt(args[1]); //サーバ側の待受ポート番号
    
                // 送信するパケットを生成
                byte buffer[] = args[2].getBytes();
                DatagramPacket dp = new DatagramPacket(buffer, buffer.length, addr, port);
    
                // ソケットを生成してパケットを送信
                DatagramSocket ds = new DatagramSocket();
                ds.send(dp);
                ds.close();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    実行例

    サーバーサイド

    $ javac Server.java && java Server 8888
    qoosky
    

    クライアントサイド

    $ javac Client.java && java Client localhost 8888 qoosky
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    筋トレ始めました。バックエンドエンジニアです。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • Spring Security フォームログインのサンプルコード
        Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
        えびちゃんえびちゃん12/4/2019に更新
        いいねアイコン画像0
      • Java配列の宣言方法 (C/C++との違い)
        Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
        てんとうむしてんとうむし5/13/2018に更新
        いいねアイコン画像0
      • PlantUML による UML 図の描き方
        サムネイル画像-c788fffde5
        PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
        kentakenta1/21/2020に更新
        いいねアイコン画像0
      • Akka HTTP サンプルコード (Scala)
        サムネイル画像-a98142497c
        Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
        雄太雄太10/7/2021に更新
        いいねアイコン画像0
      • Kestrel の使用例
        Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
        したくんしたくん10/12/2017に更新
        いいねアイコン画像0