logo

Javaソケットプログラミング

Java Socket プログラミングは、異なる JRE 上で実行されているアプリケーション間の通信に使用されます。

Java Socket プログラミングは、コネクション指向またはコネクションレスで行うことができます。

Socket クラスと ServerSocket クラスはコネクション型ソケット プログラミングに使用され、DatagramSocket クラスと DatagramPacket クラスはコネクションレス型ソケット プログラミングに使用されます。

ソケット プログラミングのクライアントは、次の 2 つの情報を知っている必要があります。

  1. サーバーのIPアドレス、および
  2. ポート番号。

ここでは、クライアントとサーバーの一方向通信を行います。このアプリケーションでは、クライアントがサーバーにメッセージを送信し、サーバーがメッセージを読み取って印刷します。ここでは、Socket と ServerSocket の 2 つのクラスが使用されています。 Socket クラスは、クライアントとサーバーの通信に使用されます。このクラスを通じて、私たちはメッセージを読み書きすることができます。 ServerSocket クラスはサーバー側で使用されます。 ServerSocket クラスの accept() メソッドは、クライアントが接続されるまでコンソールをブロックします。クライアントの接続が成功すると、サーバー側で Socket のインスタンスが返されます。

Java でのソケット プログラミング

ソケットクラス

ソケットは、単にマシン間の通信のエンドポイントです。 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 ネットワーク プログラミング

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(); }}