トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

OneToOneJ

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 を通常の設定で使っているなら、ソースファイルを保存すると同時にコンパイルされる。

  実行

自分のコンピュータ内でプロセス間通信

  1. Eclipse 上でサーバをJavaアプリケーションとして起動する。サーバプロセスは接続待ちの状態になる。
  2. クライアントをJavaアプリケーションとして起動する。接続先ホスト名を聞くダイアログが開くので
localhost

を指定する。

  1. 以後の動作はソースに書いてある通り。

他のコンピュータと通信

  • 途中にファイアーウォールが無いことが前提。実験したいときは管理者に相談すること。
  • クライアント側は相手のIPアドレスを接続先のホスト名に指定する。
  • サーバ側のマシンのIPアドレスはオフラインで教えてあげよう。
  • IPアドレスはWindows OSの場合は ipconfig コマンドで確認できる。UNIX系OSやMacを使っている人には説明は不要ですね。
  • 同じLAN上でうまくつながらないときは、ネットワークの種類が public network になっていないかチェックしてほしい。もしそうなら「不要なポート」は遮断されている可能性が高いので、会社とか家庭内の設定に直してうまくいくか試してみるとよい。