四十二、Javaネットワークプログラミングの浅い分析


1.ネットワークプログラミングの基本概念
ネットワークプログラミングは物理的に一緒にいないホストを相互接続させ、ネットワーク接続過程はネットワークプロトコルを使用する必要があり、よく見られる通信プロトコルはTCP、UDPプロトコルである.
  • TCP:信頼できる接続に属する、三者握手で接続の確認を完了する.
  • UDP:信頼できない接続に属する.

  • ネットワークの開発には2つのアーキテクチャがある:C/SとB/S.
    2.単純TCPプログラム実現
    ネットワーク開発パッケージが存在するクラスはjavaです.Net開発パッケージこのパッケージでは、Server Socket、Socketクラスを使用して、サーバとクライアントの開発を完了できます.TCPプログラムを開発するには、まずサーバ側を開発し、サーバSocketを用いてクライアントの接続受信を行い、各クライアントはプログラム上でSocketオブジェクト表示を用いる.
    Serverコード:
    package com.ares.demo.helloserver;
    
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class HelloServer {
    
    	public static void main(String[] args) throws Exception {
    		ServerSocket server = new ServerSocket(8888); //  8888       
    		Socket client = null; //         
    		System.out.println("       ... ...");
    		client = server.accept(); //         
    		OutputStream out = client.getOutputStream(); //          
    		PrintStream pout = new PrintStream(out);
    		pout.println("hello world!!!");
    		pout.close();
    		out.close();
    		client.close();
    		server.close(); 
    	}
    
    }

    Clientコードの例:
    package com.ares.demo.helloserver;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.Socket;
    
    public class HelloClient {
    	public static void main(String[] args) throws Exception {
    		Socket client = new Socket("localhost", 8888);//           
    		BufferedReader buf = null;
    		buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
    		String str = buf.readLine();//        
    		System.out.println("   :" + str);
    		client.close();
    	}
    
    }

    3.echoプログラム実装
    Severコードの例:
    package com.ares.demo.echoserver;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class EchoServer {
    
    	public static void main(String[] args) throws Exception {
    		ServerSocket server = new ServerSocket(8888); //  8888       
    		Socket client = null; //         
    		boolean flag = true;
    		while (flag) {
    			System.out.println("       ... ...");
    			client = server.accept(); //         
    			BufferedReader buf = new BufferedReader(new InputStreamReader(
    					client.getInputStream()));
    			PrintStream pout = new PrintStream(client.getOutputStream());
    					//          
    			boolean temp = true;
    			while (temp) {//               
    				String str = buf.readLine();
    				if (str == null || "".equals(str)) {
    					temp = false;
    					break;
    				}
    				if ("bye".equals(str)) {
    					temp = false;
    					break;
    				}
    				pout.println("ECHO:" + str); //     
    			}
    			pout.close();
    			client.close();
    		}
    		server.close();
    	}
    
    }

    Clientコードの例:
    package com.ares.demo.echoserver;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    
    public class EchoClient {
    	public static void main(String[] args) throws Exception {
    		Socket client = new Socket("localhost", 8888);//           
    		BufferedReader input = new BufferedReader(new InputStreamReader(
    				System.in));
    		BufferedReader buf = null;
    		buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
    		PrintStream out = new PrintStream(client.getOutputStream());
    		boolean flag = true;
    		while (flag) {
    			System.out.print("         :") ;
    			String str = input.readLine();//        
    			if (str == null || "".equals(str)) {
    				flag = false;
    				break;
    			}
    			if ("bye".equals(str)) {
    				flag = false;
    				break;
    			}
    			out.println(str) ;
    			System.out.println(buf.readLine()) ;
    		}
    		client.close();
    	}
    
    }

    このコードは、単一スレッドの接続アクセスにのみ適する.さらに最適化することができる.
    4.マルチスレッドのechoプログラム
    サーバコードの例:
    ①EchoThreadコード
    package com.ares.demo.echothreadserver;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    
    public class EchoThread implements Runnable {
    	private Socket client;
    
    	public EchoThread(Socket client) {
    		this.client = client;
    	}
    
    	public void run() {
    		try {
    			BufferedReader buf = new BufferedReader(new InputStreamReader(
    					client.getInputStream()));
    			PrintStream pout = new PrintStream(client.getOutputStream());
    				//          
    			boolean temp = true;
    			while (temp) {//               
    				String str = buf.readLine();
    				if (str == null || "".equals(str)) {
    					temp = false;
    					break;
    				}
    				if ("bye".equals(str)) {
    					temp = false;
    					break;
    				}
    				pout.println("ECHO:" + str); //     
    			}
    			pout.close();
    			client.close();
    		} catch (Exception e) {
    		}
    	}
    }

    ②EchoServerコード
    package com.ares.demo.echothreadserver;
    
    import java.net.ServerSocket;
    
    public class EchoServer {
    
    	public static void main(String[] args) throws Exception {
    		ServerSocket server = new ServerSocket(8888); //  8888       
    		boolean flag = true;
    		while (flag) {
    			System.out.println("       ... ...");
    			new Thread(new EchoThread(server.accept())).start() ;
    		}
    		server.close();
    	}
    }

    :このプログラムはマルチスレッドへのアクセスを実現します.
    .
    5.UDPプログラム実装
    UDPのプログラムはデータ・レポートの形式で現れ、以下の2つのクラスに使用する必要があります.
  • データ・レポートの内容:DatagramPacket
  • データ・レポートの送信と受信:DatagramSocket
  • クライアントコード:
    package com.ares.demo.udpdemo;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class UDPSend {
    
    	public static void main(String[] args) throws Exception {
    		DatagramSocket socket = new DatagramSocket(9000); 
    		//      9000              
    		String str = "hello world!!!";
    		DatagramPacket pack = new DatagramPacket(str.getBytes(), 0, str
    				.length(), InetAddress.getLocalHost(), 3000);//   1024   
    					//3000         
    		socket.send(pack);
    	}
    
    }

    サーバ側コード:
    package com.ares.demo.udpdemo;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UDPReceive {
    
    	public static void main(String[] args) throws Exception {
    		DatagramSocket socket = new DatagramSocket(3000); 
    		//     3000              
    		DatagramPacket pack = new DatagramPacket(new byte[1024], 1024);
    		//   1024   
    		socket.receive(pack);
    		System.out.println("       :" + new String(pack.getData())) ;
    	}
    
    }

    20150529
    JAVA学習ノートシリーズ
    --------------------------------------------
    連絡先
    --------------------------------------------
            Weibo: ARESXIONG
            E-Mail: [email protected]
    ------------------------------------------------