Javaによる初めてのネットワークプログラミング
環境
Eclipse でやろう。
参考文献
- UNIXネットワークベストプログラミング、雪田修一、技術評論社
- Javaネットワークプログラミング、小高知宏、オーム社
- http://java2009.cis.k.hosei.ac.jp/
作業環境
Eclipse で適当なプロジェクトを新規作成する。プロジェクト内にone2oneというパッケージを作成する。
サンプルプログラム
サーバ 接続を待つ側 Server.java
package one2one; import java.io.*; import java.net.*; import javax.swing.*; public class Server { static final int port = 10100; public static void main(String[] args) { ServerSocket serverSoc = null; Socket soc = null; try{ serverSoc = new ServerSocket(port); soc = serverSoc.accept(); serverSoc.close(); BufferedReader reader = new BufferedReader( new InputStreamReader(soc.getInputStream())); PrintWriter writer = new PrintWriter(new OutputStreamWriter( soc.getOutputStream())); JOptionPane.showMessageDialog(null, "Server:接続がありました。"); writer.println("こんにちは"); writer.flush(); while(true){ // 受信 String lineReceived = reader.readLine(); if(lineReceived.equals("quit")){ soc.close(); JOptionPane.showMessageDialog(null, "終了です"); System.exit(0); } // 送信 String lineToSend = JOptionPane.showInputDialog("Server受信: " + lineReceived); writer.println(lineToSend); writer.flush(); if(lineToSend.equals("quit")){ soc.close(); System.exit(0); } } }catch(IOException e){ System.exit(1); } } }
クライアント 接続を要求する側 Client.java
package one2one; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import javax.swing.JOptionPane; public class Client { static final int port = 10100; public static void main(String[] args) { Socket soc = null; try{ String hostname = JOptionPane.showInputDialog("Server のホスト: "); soc = new Socket(hostname, port); BufferedReader reader = new BufferedReader( new InputStreamReader(soc.getInputStream())); PrintWriter writer = new PrintWriter(new OutputStreamWriter( soc.getOutputStream())); while(true){ // 受信 String lineReceived = reader.readLine(); if(lineReceived.equals("quit")){ soc.close(); JOptionPane.showMessageDialog(null, "Client:終了です"); System.exit(0); } // 送信 String lineToSend = JOptionPane.showInputDialog("Client受信: " + lineReceived); writer.println(lineToSend); writer.flush(); if(lineToSend.equals("quit")){ soc.close(); System.exit(0); } } }catch(IOException e){ System.exit(1); } } }
コンパイル
Eclipse を通常の設定で使っているなら、ソースファイルを保存すると同時にコンパイルされる。
実行
自分のコンピュータ内でプロセス間通信
- Eclipse 上でサーバをJavaアプリケーションとして起動する。サーバプロセスは接続待ちの状態になる。
- クライアントをJavaアプリケーションとして起動する。接続先ホスト名を聞くダイアログが開くので
localhost
を指定する。
- 以後の動作はソースに書いてある通り。
他のコンピュータと通信
- 途中にファイアーウォールが無いことが前提。実験したいときは管理者に相談すること。
- クライアント側は相手のIPアドレスを接続先のホスト名に指定する。
- サーバ側のマシンのIPアドレスはオフラインで教えてあげよう。
- IPアドレスはWindows OSの場合は ipconfig コマンドで確認できる。UNIX系OSやMacを使っている人には説明は不要ですね。
- 同じLAN上でうまくつながらないときは、ネットワークの種類が public network になっていないかチェックしてほしい。もしそうなら「不要なポート」は遮断されている可能性が高いので、会社とか家庭内の設定に直してうまくいくか試してみるとよい。