**Javaソケットプログラミング-奥行き**


ソケットプログラミングTCP/UDP:javaにはクライアントとサービス側の通信を担当する専門クラスがあり、通信の種類は2種類ある:TCPとUDP、TCPは典型的なサービス側/クライアントモデルであり、彼はクライアントとサービス側の接続を通じてjava IOストリームを使用して効果を達成する.UDPでは、通信のためにデータ・レポートを使用しています.tcp通信は専用の接続チャネルを確立し,このチャネルを介して通信を行い,udpはデータグラムの受信送信で通信効果を達成する必要がある.両者の違いは、通信チャネルを確立する必要があるかどうかである.簡単な例を挙げると、TCP通信は電話に相当し、他の人に電話をかけるには、他の人の電話番号を知る必要があります.IPアドレスに相当します.電話が通じると、電話をかける双方の間に信号通路があり、互いに相手の言うことが聞こえ、電話が切れると通信通路が破壊され、この時は何も聞こえなくなります.この时、あなたはメールを送ることができるかどうかを考えることができます.もちろん、UDPはメールを送ることに相当します.私は相手の電話番号を知っているだけで、直接メールを編集して彼に送るだけでいいです.専門の通路を作る必要はありません.しかし、UDPには明らかな欠点があります.だからUDPの欠点はすぐに相手に知られることができなくて、甚だしきに至っては相手が受け取れないかもしれません.しかし,2つの通信方式は実際のプログラミングで互いに結合して使用され,互いに長所と短所を補う.
TCP:tcpには主に2つのクラスがあります.SocketServerSocket,Socketはクライアントに使用され、Server Socketはサービス側に使用されます.Socketの使い方:Socket socket = new Socket(ip,port);で最もよく使われる構造方法の一つで、アドレスがipのサーバに接続することを意味し、ポートがportである.一般的にsocket通信はIOストリームを使用して書き込みと読み取りを行い、クライアントはストリームの中に物を書き、socketはgetInputStream()getOutputStream()の方法を呼び出すことで出力入力ストリームを取得し、サービス側はストリームの中からデータを読み出した後、ストリームの中に物を書き、クライアントはストリームの中から情報を読み取り、会話を完了する.
    BufferedWriter bw = new BufferedWriter(new InputStreamWriter(socket.getOutpouStream()));
     bw.write("hello world");

 //       ,           
bw.fllush();
`ServerSocket`  :`ServerSocket serversocket = new ServerSocket(port)`;      ,    :
//                          ,    Socket
  

Socket socket = serversocket.accept();
      //     ,          
      `BufferedReader br = new BufferedReader(new`  

InputStreamReader(socket.getInputStream()));
 byte[] buf = new byte[2048];
     //  read  ,          byte   ,      
  

       int len = in.read(buf);
     // byte        
     System.out.println(new String(buf,0,len) );
            :
        BufferedReader bo= new BufferedWriter(new   InputStreamWriter(socket.getOutputStream()));
        String s = "    ,      ";
        bo.write(s);
       BufferedReader         .

次に、クライアントについて具体的な例を示します.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
private int port;

private String address;

private Socket socket;

private BufferedWriter out;

private BufferedReader in;
public Client(int port,String address){
	
	this.port = port;
	
	this.address = address;
	
}

public void start() throws UnknownHostException, IOException{
	
	//      
	socket = new Socket(address,port);
	
	//   
	in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    
	out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
	//        
	
	out.write("       "); 

    out.flush();
	
    System.out.println("        :");
    	 
    	try{
    		//while            
    		while(true){	
                //   readLine()         
    			char[] cbuf = new char[2048];
    			
    			int len = in.read(cbuf);
    			
    			System.out.println("       :"+new String(cbuf,0,len));
    			
    			Scanner scan = new Scanner(System.in);
    			
    			String s = scan.next();
    			if(!s.equals("  ")){
	        		
    	            out.write(s);
    	        	
    	        	out.flush();
    	        	
    	        	}else{
    	        			socket.close();
    	        			in.close();
    	        			out.close();
    	        			socket.close();
    	        	}
    		 }
    			}catch(Exception e){
    				
    				e.printStackTrace();
    			}finally{
    				
    				try{
    				System.out.println("       ");
    				}catch(Exception e){
    					e.printStackTrace();
    				}
    			}
}

   public static void main(String[] args) throws UnknownHostException, IOException{
	   Client client = new Client(9994,"127.0.0.1");
	   client.start();
}

}
サービス:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Service {

	private  BufferedReader in;
	
	private BufferedWriter out;
	
	private ServerSocket serversocket;
	
	private Socket socket;
	
	private int port;
	
	public Service(int port){
		
		this.port = port;
		
	}
	
	public void response() throws IOException, InterruptedException{
		
		 try {		
					//      
			serversocket = new ServerSocket(this.port);
			
			System.out.println("            :");
			//  ,        
		    socket = serversocket.accept();
		    
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			
		    out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		  
		    System.out.println("    ,     :"+socket);
		    //          
		    try{
		    	while(true){
			    char[] cbuf = new char[2048];
			   
			    int len = in.read(cbuf);	

		        System.out.println("       :"+new String(cbuf,0,len));
		        //out.write("         ,     ");
		        //     out.flush,         ,     
		        //out.flush();
		        Scanner scan = new Scanner(System.in);
		                  	        	 
		        String s = scan.next();
		        	
		        if(!s.equals("  ")){
		        		
		            out.write(s);
		        	
		        	out.flush();
		        	
		        	}else{
		        			serversocket.close();
		        			in.close();
		        			out.close();
		        			socket.close();
		        	}
		    	}
		        }catch(Exception e){
		        	e.printStackTrace();
		        }
			//        
			//     nextLine,          ,         ,       ,    
		} catch (IOException e) {
		
			e.printStackTrace();
		} 			
	}
	
	 
	 /*public class LogicThread extends Thread{
		
		 private  BufferedReader in;
		 private BufferedWriter out;
		 private ServerSocket serversocket;
		 private Socket socket;
		 public LogicThread(BufferedReader in,BufferedWriter out,Socket socket,ServerSocket serversocket){
			 this.in = in;
			 this.out = out;
			 this.socket = socket;
			 this.serversocket = serversocket;
		 }
		 public void run(){
			 
		 while(true){
			 
			
		 }
	 }
 }*/
	public static void main(String[] args) throws IOException, InterruptedException{
		
		Service service = new Service(9994);
		
		service.response();
		
		//service.serversocket.close();
	}
}

UDPプログラミング:
クライアント:
DatagramSocket:   ,     ,    :
DatagramSocket  ds = new DatagramSocket();           ,             ,        ,                     
DatagramPacket:   ,     ,    :
String s = "heelo world";
byte[] buf = s.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,Ip,port);
   IP        ,        。
           :ds.send(dp);

   :
           ,               ,      :
DatagramSocket ds = new DatagramSocket(port);
  :
byte[] buf = new btye[2048]
//     
DatagramPacket dp = new DatagramPacket(buf,buf.length);
        dp 
ds.receive(dp);
  :
byte[] buf1 = dp.getData();
System.out.println(new String(buf1,0,buf1.length()));
        :
String s = "  ";
byte[] buf2 = s.getBytes();
//               ip port,       
ds.send(buf2,buf2.length,dp.getAddress(),dp.getPort());

クライアントはreceive()メソッドを介してサービス側から返されたメッセージを受信すると、通信を完了することができる.
例:クライアント:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
 
	private int port;
	
	private InetAddress address;
	//        
	private DatagramPacket send;
	//            
	private DatagramPacket recieve;
	
	private DatagramSocket socket;
	
	public Client(int port,InetAddress address){
		
		this.port = port;
		this.address = address;
	}
	public void send()  {
		//            ,     ,             ,      ip   ,       
		try{
			
		socket = new DatagramSocket();
		//  
		Scanner  scan = new Scanner(System.in);
		
		while(true){
        
		String s = scan.next(); 	 
        //       byte   buf    
		byte[] buf = s.getBytes();
		
		send = new DatagramPacket(buf,buf.length,address,port);
		
		socket.send(send);
		
		System.out.println("    ,       ");
		//  
		
		byte[] rbuf = new byte[2048];
		
		recieve = new DatagramPacket(rbuf,rbuf.length);
		
		//           
		socket.receive(recieve);
		//    
		byte[] rbuf1 = recieve.getData();
		
		int len = rbuf1.length;

		System.out.println("    :"+new String(rbuf1,0,len));
		}
		}catch(Exception e){
			
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws UnknownHostException{
		
		Client client = new Client(9998,InetAddress.getByName("127.0.0.1"));
		
		client.send();
		
	}
}

サービス:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Scanner;

public class Service { 
	 
	 private int port;
	 private DatagramPacket send;
	 private DatagramPacket recieve;
	 private DatagramSocket socket;
	 
	 public Service(int port){
		 
		 this.port = port;
	 }
	 
	 public void recieve() throws IOException{
		 //      
		 socket = new DatagramSocket(port);
		 
		 System.out.println("       ");	 
			 //             
		 new LogicThread(recieve,socket);
			 //System.out.println("    ");
	 }
	 
	 public class LogicThread extends Thread{
	  
		 public DatagramPacket recieve;
		 public DatagramSocket socket;
		 
		 public LogicThread(DatagramPacket recieve,DatagramSocket socket){
			 this.recieve = recieve;
			 this.socket = socket;
			 start();
		 }
		 public void run(){
			
			 try{
				 
			//while            
             while(true){
			
             byte[] rbuf = new byte[2048];
    			 //     ,      
    		 recieve = new DatagramPacket(rbuf,rbuf.length);
    			 //         ,    
    		 socket.receive(recieve);	 
            	 
             byte[] buf = recieve.getData();
			 
			 int len = buf.length;
			 
			 System.out.println("       :"+new String(buf,0,len));
			 
			 //        
			 Scanner scan = new Scanner(System.in);
			 
			 String s = scan.next();
			   
			 byte[] sbuf = s.getBytes();
			 
			 send = new DatagramPacket(sbuf,sbuf.length,recieve.getAddress(),recieve.getPort());
			 
			 socket.send(send);
			 }
			 }catch(Exception e){
				 e.printStackTrace();
			 }
		 }
	 }
	 
	 public static void main(String[] args) throws IOException{
		 
		 Service service = new Service(9998);
		 
		 service.recieve();
	 }
	 
}


简単なTCP/UDP通信をここまで绍介します.何か悪いことがあったら、できるだけ指摘してください.そうすれば、共に进歩することができますよね.