Socket通信、TCP/UDP

6036 ワード

  • TCPとUDPの違い:
  • TCP:接続に基づいて構築される;安全性が高いです.伝送速度が低い.データ量の多いデータの転送に適しています
    UDP:非接続に基づいて構築される;安全性が低い.伝送速度が高い.データ量の少ないデータ
    クライアント:(app,ブラウザ)サーバ側:ホストに等しくない
  • エンドスローガン
  • 同じホスト上の各サーバには独自のポート番号があり、値範囲:0~65535
  • 共通ポート:808080
  • 注意点:
  • クライアントとサーバ側のポート番号が一致することを保証する
  • 同じホスト上の異なるサーバポート番号が異なることを保証する
  • UDP
    注意:作業中は、まずサービス側を実行し、リスニング状態にしてからクライアントを実行する必要があります.
  • クライアント:
  • UDP通信を作成するオブジェクト:socketオブジェクト---対応するクラスはDatagramSocket(UDPの受信および送信用)
  • である.
    DatagramSocket datagramSocket = new DatagramSocket();
    
  • データの準備---パッケージ:DatagramPacket(関連する属性、データを含むパケット)
  • /**
    	 *  
    	 *  : 
    	 *  : 
    	 *  : 
    	 *  : 
    	 */
    	byte[] buf = "bingbing".getBytes();
    	DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 521);
    
  • は、sendメソッド
  • を介してデータを送信する.
    datagramSocket.send(packet);
    
  • socketオブジェクト
  • を閉じる
    datagramSocket.close();
    
  • サーバ側
  • 1.socketオブジェクトを作成し、ポート番号をバインドする
    DatagramSocket socket = new DatagramSocket(521);
    
  • パケットオブジェクトを作成し、空の配列を作成し、送信データ
  • を受信する準備をする.
    byte[] buf = new byte[1024];
    	DatagramPacket packet = new DatagramPacket(buf, buf.length);
    

    3.データの受信---サーバが実行されると、このメソッドは常にリスニングされます.
    socket.receive(packet);
    
    // 
    byte[] bs = packet.getData();
    System.out.println(new String(bs));// 
    

    4.関連オブジェクトを閉じる
    socket.close();
    

    例:随時送信随時受信を実現
    クライアント:
           DatagramSocket socket = new DatagramSocket();
    	   BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
    	   String date = null;
    	   while((date = bReader.readLine())!=null) {
    		   DatagramPacket packet = new DatagramPacket(date.getBytes(), date.getBytes().length,InetAddress.getLocalHost(),1234);
    		   socket.send(packet);
    		   String string = new String(packet.getData()).trim();
    		   if (string.equals("over")) {
    			break;
    		}
    	   }
    	   socket.close();
    

    サーバ側:
        DatagramSocket socket = new DatagramSocket(1234);
    	while(true) {
    		byte[] buf = new byte[1024];
    		DatagramPacket packet = new DatagramPacket(buf, buf.length);
    		socket.receive(packet);
    		
    		String string = new String(packet.getData()).trim();
    		System.out.println(string);
    		if (string.equals("over")) {
    			break;
    		}
    	}
    	socket.close();
    

    TCP
    クライアントがサーバ側と通信する際には、クライアントに対して着信と出力を行う.そのため、Socket内部には入力ストリームと出力ストリームが内蔵されており、データ転送時にSocketオブジェクトの内部にデータを入れ、Socketオブジェクトをサーバ側に転送することで、クライアントとサーバ側の間にチャネルが確立され、両端に同じSocketオブジェクトが使用される
  • クライアント:
  • 1.Socketオブジェクトを作成し、サーバのアドレスとポートをバインド
    Socket socket = new Socket(InetAddress.getLocalHost(), 526);
    

    2.データの準備
    String date = "BigData1812, ";
    

    3.ソケット内部の出力ストリームを取得する
    OutputStream o = socket.getOutputStream();
    

    4.ネットワークにデータを書き込む
    o.write(date.getBytes());
    

    5.サーバ側から転送されたデータ
    InputStream inputStream = socket.getInputStream();
    byte[] ar = new byte[1024];
    int num = inputStream.read(ar);
    System.out.println(new String(ar, 0, num));
    

    5.ストリームを閉じる
    socket.close();
    
  • サーバ側:
  • サーバソケットオブジェクトを作成し、ポート
  • をバインド
    ServerSocket serverSocket = new ServerSocket(526);
    

    2.ソケットの接続を受信し、クライアントとサーバ側が同じsocketオブジェクトを使用していることを保証する---常に傍受状態である
    Socket socket = serverSocket.accept();
    

    3.入力フローの取得
    InputStream inputStream = socket.getInputStream();
    

    4.コンテンツをコンソールに書き込む
    byte[] ar = new byte[1024];
    int num = inputStream.read(ar);
    System.out.println(new String(ar, 0, num));
    

    5.サーバのデータをクライアントに書き込む
    OutputStream outputStream = socket.getOutputStream();
    outputStream.write(" ".getBytes());
    

    6.該当するオブジェクトを閉じる
    socket.close();
    

    クライアントとサーバのTCP通信を文字ストリームで実現
  • クライアント
  • SOcketオブジェクトを取得し、インタフェース、IPをバインド
    Socket socket = new  Socket(InetAddress.getLocalHost(),121);
    		
    

    入力ソースを取得し、コンソールを入力ソースとする
    BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
    		
    

    入力ストリームを取得し、ネットワークに出力
    OutputStream outputStream = socket.getOutputStream();
    PrintWriter printWriter = new PrintWriter(outputStream,true);// true , , print,println 
    		
    

    サーバから送信されたデータを受信
    InputStream inputStream = socket.getInputStream();
    BufferedReader brReader1 = new BufferedReader(new InputStreamReader(inputStream));
    		
    

    入力ストリームをネットワークに転送
    String date = null;
    while((date = bReader.readLine())!=null) {
    printWriter.println(date);
    // , 
    			
    // over 
    if ("over".equals(date)) {
    		break;
    	}
    String getDate = brReader1.readLine();
    System.out.println(""+getDate);
    		}
    

    クローズフロー
            bReader.close();
    		brReader1.close();
    		printWriter.close();
    		socket.close();
    
  • サーバ側
  • ServerSocketオブジェクトの取得
    ServerSocket serverSocket = new ServerSocket(121);
    	
    

    ソケットを使用した接続は、クライアントとサーバ側が同じsocketを使用することを保証します.
    Socket socket = serverSocket.accept();
    

    入力フローの取得
    InputStream inputStream = socket.getInputStream();
    BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream));
    	
    

    出力ストリームの取得
    PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
    	
    

    データを読み取り、希望するデータをユーザー側に返す
        String date = null;
    	while((date = bReader.readLine())!=null) {
    		// , 
    		//System.out.println(date.toUpperCase());
    		printWriter.println(" --->:"+date.toUpperCase());
    		// over 
    		if ("over".equals(date)) {
    			break;
    		}
    		
    	}
    

    クローズフロー
        bReader.close();
    	printWriter.close();
    	serverSocket.close();