Javaネットワークプログラミング知識整理


一、ネットワークプロトコル
JAva.netパッケージには、2つの一般的なネットワークプロトコルのサポートがあります.
TCP:TCPは、2つのアプリケーション間の信頼性の高い通信を保証する伝送制御プロトコルの略です.一般的にインターネットプロトコルに用いられ、TCP/IPと呼ばれる.
UDP:UDPは、ユーザー・データ・レポート・プロトコルの略で、接続されていないプロトコルです.アプリケーション間で送信するデータを提供するパケット.
二、InetAddress類
クラスのインスタンスにはIPアドレスが含まれ、対応するホスト名も含まれます.以下はその中のいくつかのよく使われる方法の学習です.
//static InetAddress getLocalHost()       
@Test
public void test_01() throws  Exception{
    InetAddress localHost = InetAddress.getLocalHost();
    //           /IP  
    System.out.println(localHost);
}
//    IP  、     
@Test
public void test_02() throws  Exception{
    InetAddress localHost = InetAddress.getLocalHost();
    //  IP  
    String hostAddress = localHost.getHostAddress();
    System.out.println(hostAddress);
    //     
    String hostName = localHost.getHostName();
    System.out.println(hostName);
}
//static InetAddress getByName(String host)                 IP   。
@Test
public void test_03() throws Exception{
    //              
    InetAddress inetAddress = InetAddress.getByName("91BYBAQ2869O8A9");
    System.out.println(inetAddress);
}


三、UDP通信
Javaでは、クラスDatagramPacketとクラスDatagramScoketがパケットを送受信します.(受信側を先に実行し、送信側を実行する)
//UDP   
public class UDPSendDemo {

    public static void main(String[] args) throws Exception{
        //  InetAddress  ,  IP(                  )
        InetAddress inet = InetAddress.getByName("127.0.0.1");
        //      
        byte[] data = "Hello UDP!".getBytes();
        //  DatagramPacket  ,               
        //    DatagramPacket(byte[] buf, int length, InetAddress address, int port)       ,       length                 。
        DatagramPacket dp = new DatagramPacket(data, data.length, inet, 6100);
        //  DatagramSocket,          ,       ,          
        DatagramSocket socket = new DatagramSocket();
        //     
        socket.send(dp);
        //    
        socket.close();
    }
}


//UDP   
public class UDPReceiveDemo {
    public static void main(String[] args) throws Exception{
        //  DatagramSocket  ,            
        DatagramSocket socket = new DatagramSocket(6100);
        //           
        byte[] data = new byte[1024];
        //  DatagramPacket  
        DatagramPacket dp = new DatagramPacket(data, data.length);
        //  DatagramSocket     receive(DatagramPacket dp)         
        socket.receive(dp);

        //            
        int length = dp.getLength();
        //       
        System.out.println(new String(data,0,length));

        //      IP  
        String hostAddress = dp.getAddress().getHostAddress();
        System.out.println(hostAddress);

        //         
        int port = dp.getPort();
        System.out.println(port);

        //    
        socket.close();
    }
}

四、TCP通信
Javaでは、サーバ側ソケット、ソケットクラス、クライアントソケットを表すサーバソケットクラスが用意されています.
次の手順は、2台のコンピュータ間でソケットを使用してTCP接続を確立するときに発生します.
1.サーバは、サーバ上のポートを介して通信することを示すサーバSocketオブジェクトをインスタンス化します.
2.サーバは、クライアントがサーバ上の指定されたポートに接続されるまで待機するサーバソケットクラスのaccept()メソッドを呼び出します.
3.サーバーが待機している間、クライアントはSocketオブジェクトをインスタンス化し、サーバー名とポート番号を指定して接続を要求します.
4.Socketクラスのコンストラクション関数は、クライアントを指定したサーバとポート番号に接続しようとします.通信が確立されると、クライアントにSocketオブジェクトを作成してサーバと通信することができます.
5.サーバ側でaccept()メソッドは、クライアントのsocketに接続されたサーバ上の新しいsocket参照を返します.
接続が確立されると、I/Oストリームを用いて通信することにより、各ソケットには1つの出力ストリームと1つの入力ストリームがあり、クライアントの出力ストリームはサーバ側の入力ストリームに接続され、クライアントの入力ストリームはサーバ側の出力ストリームに接続される.
例:(サーバ側が先に起動し、クライアント接続を待つ)
//TCP   
public class TCPServer {

    public static void main(String[] args) throws Exception{
        //  ServerSocket  ,     ServerSocket(int port)                 。
        ServerSocket serverSocket = new ServerSocket(6100);
        //    accept()  ,     Socket  
        Socket socket = serverSocket.accept();
        //  Socket          ,          
        InputStream in = socket.getInputStream();
        byte[] data = new byte[1024];
        int len = in.read(data);
        System.out.println(new String(data,0,len));

        //           ,  Socket            
        OutputStream out = socket.getOutputStream();
        out.write("      !".getBytes());

        //    
        socket.close();
        serverSocket.close();
    }
}


//TCP   
public class TCPClient {

    public static void main(String[] args) throws Exception{
        //Socket        Socket(String host, int port)                          。
        //         ,          ,      ,      
        Socket socket = new Socket("127.0.0.1", 6100);
        //         ,         
        OutputStream out = socket.getOutputStream();
        out.write("      !".getBytes());

        //          ,  Socket         
        InputStream in = socket.getInputStream();
        byte[] data = new byte[1024];
        int len = in.read(data);
        System.out.println(new String(data,0,len));
        //    
        socket.close();
    }
}