Java Socket プログラミングは、異なる JRE 上で実行されているアプリケーション間の通信に使用されます。
Java Socket プログラミングは、コネクション指向またはコネクションレスで行うことができます。
Socket クラスと ServerSocket クラスはコネクション型ソケット プログラミングに使用され、DatagramSocket クラスと DatagramPacket クラスはコネクションレス型ソケット プログラミングに使用されます。
ソケット プログラミングのクライアントは、次の 2 つの情報を知っている必要があります。
- サーバーのIPアドレス、および
- ポート番号。
ここでは、クライアントとサーバーの一方向通信を行います。このアプリケーションでは、クライアントがサーバーにメッセージを送信し、サーバーがメッセージを読み取って印刷します。ここでは、Socket と ServerSocket の 2 つのクラスが使用されています。 Socket クラスは、クライアントとサーバーの通信に使用されます。このクラスを通じて、私たちはメッセージを読み書きすることができます。 ServerSocket クラスはサーバー側で使用されます。 ServerSocket クラスの accept() メソッドは、クライアントが接続されるまでコンソールをブロックします。クライアントの接続が成功すると、サーバー側で Socket のインスタンスが返されます。
ソケットクラス
ソケットは、単にマシン間の通信のエンドポイントです。 Socket クラスを使用してソケットを作成できます。
重要な方法
方法 | 説明 |
---|---|
1) パブリックInputStream getInputStream() | このソケットに接続されたInputStreamを返します。 |
2) パブリック OutputStream getOutputStream() | このソケットに接続された OutputStream を返します。 |
3) public synchronized void close() | このソケットを閉じます |
サーバーソケットクラス
ServerSocket クラスを使用してサーバー ソケットを作成できます。このオブジェクトは、クライアントとの通信を確立するために使用されます。
重要な方法
方法 | 説明 |
---|---|
1) パブリックソケット accept() | ソケットを返し、サーバーとクライアント間の接続を確立します。 |
2) public synchronized void close() | サーバーソケットを閉じます。 |
Javaソケットプログラミングの例
サーバーの作成:
サーバー アプリケーションを作成するには、ServerSocket クラスのインスタンスを作成する必要があります。ここでは、クライアントとサーバー間の通信に 6666 のポート番号を使用しています。他のポート番号を選択することもできます。 accept() メソッドはクライアントを待ちます。クライアントが指定されたポート番号で接続すると、Socket のインスタンスが返されます。
ServerSocket ss=new ServerSocket(6666); Socket s=ss.accept();//establishes connection and waits for the client
クライアントの作成:
クライアント アプリケーションを作成するには、Socket クラスのインスタンスを作成する必要があります。ここでは、サーバーの IP アドレスまたはホスト名とポート番号を渡す必要があります。ここでは、サーバーが同じシステム上で実行されているため、「localhost」を使用しています。
Socket s=new Socket('localhost',6666);
クライアントがテキストを送信し、サーバーがそれを受信して出力するという、簡単な Java ソケット プログラミングを見てみましょう。
ファイル: MyServer.java
import java.io.*; import java.net.*; public class MyServer { public static void main(String[] args){ try{ ServerSocket ss=new ServerSocket(6666); Socket s=ss.accept();//establishes connection DataInputStream dis=new DataInputStream(s.getInputStream()); String str=(String)dis.readUTF(); System.out.println('message= '+str); ss.close(); }catch(Exception e){System.out.println(e);} } }
ファイル: MyClient.java
import java.io.*; import java.net.*; public class MyClient { public static void main(String[] args) { try{ Socket s=new Socket('localhost',6666); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); dout.writeUTF('Hello Server'); dout.flush(); dout.close(); s.close(); }catch(Exception e){System.out.println(e);} } }この例をダウンロードする
このプログラムを実行するには、次の図に示すように、2 つのコマンド プロンプトを開き、各コマンド プロンプトで各プログラムを実行します。
クライアント アプリケーションを実行すると、サーバー コンソールにメッセージが表示されます。
Javaソケットプログラミングの例(読み書き両面)
この例では、クライアントが最初にサーバーに書き込み、次にサーバーがテキストを受信して印刷します。次に、サーバーはクライアントに書き込み、クライアントはテキストを受信して印刷します。ステップは続きます。
ファイル: MyServer.java
import java.net.*; import java.io.*; class MyServer{ public static void main(String args[])throws Exception{ ServerSocket ss=new ServerSocket(3333); Socket s=ss.accept(); DataInputStream din=new DataInputStream(s.getInputStream()); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str='',str2=''; while(!str.equals('stop')){ str=din.readUTF(); System.out.println('client says: '+str); str2=br.readLine(); dout.writeUTF(str2); dout.flush(); } din.close(); s.close(); ss.close(); }}
ファイル: MyClient.java
import java.net.*; import java.io.*; class MyClient{ public static void main(String args[])throws Exception{ Socket s=new Socket('localhost',3333); DataInputStream din=new DataInputStream(s.getInputStream()); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str='',str2=''; while(!str.equals('stop')){ str=br.readLine(); dout.writeUTF(str); dout.flush(); str2=din.readUTF(); System.out.println('Server says: '+str2); } dout.close(); s.close(); }}