ネットワークリクエスト (4) - ソケット

C/S構造: ソフトウェア システム アーキテクチャであるクライアント/サーバー構造。両端のハードウェア環境の利点を最大限に活用し、達成するタスクを端に合理的に割り当て、システムの通信オーバーヘッドを削減しClientますServer

Socketソケットは、TCP/IPトランスポート層に属するプロトコルをカプセル化するプログラミング呼び出しインターフェイスです。つまり、プラットフォームSocket上のプロトコル開発を通じて、2 者間のデータ送信用のチャネルを提供します。AndroidTCP/IP

ソケット

SocketTCP使用法はプロトコルに基づいて行うことができますUDP

TCPプロトコル(Transmission Control Protocol)、すなわち、Transmission Control Protocolは、トランスポート層の通信プロトコルである。およびTCPによるアプリケーション層プロトコルに基づいていますFTPTelnetSMTPHTTPPOP3DNS特徴は:

  • TCP接続指向:送信データの使用を指します。TCP最初に接続を確立する必要があり、送信が完了すると接続が解放されます。
  • 全二重通信:TCP接続が確立されると、双方がいつでもデータを送信できます。
  • TCP信頼性:接続を通じて送信されるデータを指し、エラー、損失、重複がなく、順番に到着します。
  • バイト ストリーム指向: ストリームは、プロセスに出入りする一連の文字です。簡単に言うと、送信するデータ流量が大きすぎることもありますが、TCPメッセージの長さには制限があり、一度に送信することはできず、いくつかのデータブロックに分割する必要がありますが、信頼性を確保する必要があり、受信機は、チャンクが前のデータ ストリームに再組み立てされる順序でデータを受信できます。

UDPプロトコル ( User Datagram Protocol)、つまりユーザー データグラム プロトコルは、トランスポート層の通信プロトコルです。UDPアプリケーション層プロトコルに基づいてTFTPSNMPと が存在しますDNS特徴は:

  • 接続なし:UDPデータを送信するために接続は必要ありません。
  • 信頼性が低い:UDPデータ パケットは到着するかどうかに関係なく送信されるため、パケット損失が発生する可能性があります。
  • パケット指向: データ パケットはデータ パケットと同等です。UDPアプリケーション層によって渡されるデータ パケットがどれほど大きくても、UDPパケットは送信され、TCPそのように分割されることはありません。
  • ブロッキング制御なし: ブロッキングとは、通信サブネットの特定の部分のパケット数が多すぎて処理が遅くなり、その部分またはネットワーク全体のパフォーマンスが低下することを指します。TCP接続確立後に同様の状況が発生すると、送信されたデータが宛先に届かず、その繰り返しが繰り返され、ネットワークの混雑がますます増大するため、混雑を制御するには複雑な原理が必要です。UDPこの問題がなければ。

UDPIPアプリケーション シナリオ: 電話やリアルタイム ビデオ会議などの多くのリアルタイム アプリケーションでは、ソース ホストが非常に高速でデータを送信する必要があり、ネットワークがブロックされると一部のデータが失われる可能性がありますが、その必要はありません遅延が大きすぎる場合、現時点では が考えられますUDP

Androidクライアントとサーバーの間には、次の 2 つの通信方法と 2 つの通信方法がありHTTPますSocket

  • Httpアプリケーション層に属し、データは要求応答方式で送信されます。つまり、ネットワーク接続が確立された後、クライアントがサーバーに要求を送信した後、サーバーがクライアントにデータを送信します。
  • Socketこれはトランスポート層に属し、データをアクティブに送信する方法を採用しています。つまり、ネットワーク接続が確立された後、クライアントがサーバーにリクエストを送信しなくても、サーバーはクライアントにメッセージをアクティブに送信できます。

Socket使用方法には主に次の 2 種類があります。

  • ストリームソケット ( streamsocket): プロトコルに基づいてTCP、ストリーム形式で信頼性の高いバイト ストリーム サービスを提供します。
  • データグラムソケット ( ):プロトコルdatagramsocketに基づいて、データグラムを使用してデータのパッケージ化と送信サービスを提供します。UDP

TCPプロトコルベースSocket: クライアントはオブジェクトを作成し、SocketサーバーのIPアドレスとポート番号を指定して、InputStreamサーバーから送信されたデータを読み取ります。

try {
    
    
    Socket socket = new Socket("172.16.10.108", 8080);
    InputStream inputStream = new FileInputStream("e://a.txt");
    OutputStream outputStream = socket.getOutputStream();
    byte buffer[] = new byte[4 * 1024];
    int temp = 0;
    while ((temp = inputStream.read(buffer)) != -1) {
    
    
      outputStream.write(buffer, 0, temp);
    }
    outputStream.flush();
} catch (IOException e) {
    
    
  	e.printStackTrace();
}

UDPプロトコルベースSocket: クライアントはDatagramSocketオブジェクトを作成し、リッスンするインターフェイスを指定します。

// 客户端发送数据
try {
    
    
    DatagramSocket socket = new DatagramSocket(1985);
    InetAddress inetAddress = InetAddress.getByName("192.168.1.32");
    String string = "哈哈哈哈哈哈";
    byte[] data = string.getBytes();
    DatagramPacket packet = new DatagramPacket(data, data.length, inetAddress, 10025);
    socket.send(packet);
} catch (IOException e) {
    
    
  	e.printStackTrace();
}

// 客户端接收数据
try {
    
    
    DatagramSocket socket = new DatagramSocket(1985);
    byte[] data = new byte[4 * 1024];
    DatagramPacket packet = new DatagramPacket(data, data.length);
    socket.receive(packet);
    String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
    socket.close();
} catch (IOException e) {
    
    
  	e.printStackTrace();
}

参考


@Android: これは、 Android に基づいた非常に詳細なソケット使用戦略です。ソケット通信
Android 必須: ソケット プログラミングの理解と学習の取り決め

おすすめ

転載: blog.csdn.net/xingyu19911016/article/details/124536636