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
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- 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]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...