検索
ホームページJava&#&チュートリアルJavaソケット通信の分析についての深い理解

この記事では、主に Java Socket について詳しく説明します。Socket は、ServerSocket と Socket の 2 つのカテゴリに分かれています。 JavaのSocketは通常のSocketとNioSocketの2種類に分けて紹介します。

ソケットを 2 つの都市間の交通手段に例えると、2 つの都市間を往復することができ、交通手段にはさまざまな種類があり、それぞれの交通手段にも対応する交通ルールがあります。ソケットも同様で、たくさんの種類があります。ほとんどの場合、安定した通信プロトコルである TCP/IP ストリーム ソケットが使用されます。 (TCP/IP と UDP の比較) Java のネットワーク通信は、Socket を介して実装されます。Socket は、ServerSocket と Socket の 2 つのカテゴリに分けられます。ServerSocket は、accept メソッドを介してリクエストを待機します。 Socket はリクエストをリッスンした後、特にデータ送信を完了するために使用され、クライアントは Socket を直接使用してリクエストを開始し、データを送信します。

ServerSocket の使用は 3 つのステップに分けることができます:

1. ServerSocket を作成します。 ServerSocket の構築方法は全部で 5 つあり、通常は ServerSocket (int port) が使用され、必要なのはポート番号 (port) のみです。

2. 作成した ServerSocket の accept メソッドを呼び出してリッスンします。 accept メソッドはブロッキング メソッドです。つまり、accept メソッドを呼び出した後、プログラムは停止して接続要求を待ち、要求が受信されるまでプログラムは続行されません。リクエストを受信すると、accept メソッドは Socket を返します。

3. accept メソッドによって返された Socket を使用してクライアントと通信します。

チェスト

クライアント:

package IO;

import java.io.*;
import java.net.Socket;
import java.util.Date;

/**
 * Created by zhengbin06 on 2017/2/2.
 */
public class Client {
  public static void main(String[] args) {
    String msg = "Client Data";
    try {
      Socket socket = new Socket("127.0.0.1", 9090);

      // 先写、再读
      PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
      // 发送数据
      printWriter.println(msg);
      printWriter.flush();
      // 获得服务端返回的数据
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      String line = bufferedReader.readLine();
      System.out.println("received from server: " + line + "\ttime=" + new Date().getTime());
      // 关闭资源
      printWriter.close();
      bufferedReader.close();
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}


サーバー:

package IO;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

/**
 * Created by zhengbin06 on 2017/2/2.
 */
public class Server {
  private static Socket socket = null;
  private static ServerSocket serverSocket = null;
  public static void main(String[] args) throws IOException {
    BufferedReader bufferedReader = null;
    PrintWriter printWriter = null;
    try {
      // 创建一个ServerSocket监听9090端口
      serverSocket = new ServerSocket(9090);
      while (true) {
        System.out.println("开始等待请求。。。。");
        // 等待请求
        // 监听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
        socket = serverSocket.accept();
        System.out.println("接收到请求:" + socket.toString() + "\ttime=" + new Date().getTime());
        // 接收到请求后使用socket进行通信, 创建BufferedReader用于读取数据
        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = bufferedReader.readLine();
        System.out.println("received from client: " + line + "\ttime=" + new Date().getTime());
  
        // 创建PrintWriter, 用于发送数据
        printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.println("received data: " + line + "\ttime=" + new Date().getTime());
        printWriter.flush();
      }
    } finally {
      // 关闭所有资源
      bufferedReader.close();
      printWriter.close();
      socket.close();
      serverSocket.close();
    }
  }
}


リスニングリクエスト:

新しいソケットリクエストが来ると、この接続の新しいソケット データ構造。ソケット データ情報には、正式なリクエストの送信元アドレスとポートが含まれます。この新しく作成されたデータ構造は、ServerSocket インスタンス内の未処理の接続データ構造のリストに関連付けられます。この時点では、サーバーの対応する Socket インスタンスは作成されていないため、クライアントとの 3 ウェイ ハンドシェイクが完了するまでサーバーの Socket インスタンスは返されず、Socket インスタンスに対応するデータ構造も作成されないことに注意してください。リスト内の移動はリスト内で実行されます。

データ送信:

接続が正常に確立されると、サーバーとクライアントの両方が Socket インスタンスを持ち、各 Socket インスタンスには InputStream と OutputStream があり、これら 2 つのオブジェクトを通じてデータが交換されます。

ネットワーク I/O はバイト ストリームとして送信されることを知っておく必要があります。Socket オブジェクトを作成するとき、オペレーティング システムは、データの書き込みと読み取りにそれぞれ特定のサイズのバッファー領域を割り当てます。完成しました。

書き込み側は、OutputStreamに対応するSendQキューにデータを書き込み、この時点でRecvQが満杯であれば、データは相手側のInputStreamのRecvQキューに転送されます。の OutputStream は、RecvQ キューに SendQ によって送信されたデータを収容するのに十分なスペースが確保されるまでブロックされます。プロセスを以下の図に示します。


上記は、Java ソケット通信の分析を詳しく理解する内容です。さらに関連する内容については、PHP 中国語 Web サイト (www. php.cn)!



声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。