ホームページ Java &#&チュートリアル Java でのソケット プログラミングの例を共有する (写真)

Java でのソケット プログラミングの例を共有する (写真)

May 28, 2017 am 09:20 AM
java socket プログラミング

ソケットは私たちにとって非常に実用的です。以下はこの研究のためのメモです。これは主に、例外タイプ、対話原則、ソケット、サーバーソケット、およびマルチスレッドに分かれています。リアルタイム アプリケーションやリアルタイム ゲームの場合、HTTP プロトコルではニーズを満たせないことがよくあります。現時点では、Socket は私たちにとって非常に実用的です。以下はこの研究のためのメモです。主に、例外の種類、相互作用の原則、Socket、ServerSocket、およびマルチスレッドの観点から説明されます。


例外タイプ Socket の内容を理解する前に、まず、関連する例外タイプのいくつかを理解する必要があります。次の 4 つの型はすべて IOException を継承しているため、その多くは IOException を直接ポップアップする可能性があります。

UnkownHostException: ホスト名またはIPエラー

ConnectException: サーバーが接続を拒否しました、サーバーが起動しませんでした、(キュー数を超えました、接続が拒否されました)

SocketTimeoutException: 接続がタイムアウトしました
BindException: Socketオブジェクト指定されたローカル IP アドレスまたはポートにバインドすることはできません


対話プロセス Socket と ServerSocket の間の対話については、以下の図で詳細かつ明確に説明されていると思います。


ソケットコンストラクター

Socket()Socket(InetAddress address, int port)throws UnknownHostException, IOException

Socket(InetAddress address, int port, InetAddress localAddress, int localPort)th rowsIOException

ソケット ( String host, int port)throws UnknownHostException, IOException
Socket(String host, int port, InetAddress localAddress, int localPort)throws IOException


パラメーターのない最初のコンストラクターを除き、他のコンストラクターはサーバーとの接続を確立しようとします。 。失敗した場合は、IOException エラーがスローされます。成功すると、Socket オブジェクトが返されます。

InetAddress は、ホストを記録するために使用されるクラスです。その静的 getHostByName(String msg) はインスタンスを返すことができ、その静的メソッド getLocalHost() は現在のホストの IP アドレスを取得してインスタンスを返すこともできます。 Socket(String host, int port, InetAddress localAddress, int localPort) コンストラクターのパラメーターは、それぞれターゲット IP、ターゲット ポート、バインドされたローカル IP、およびバインドされたローカル ポートです。


ソケットメソッド

getInetAddress(); リモートサーバーのIPアドレスgetPort(); リモートサーバーのポート

getLocalAddress() ローカルクライアントのIPアドレス

getLocalPort()ローカルクライアントの
getInputStream() ; 入力ストリームを取得する
getOutStream(); 出力ストリームを取得する

これらのメソッドの中で、最も重要なものは getInputStream() と getOutputStream() であることに注意してください。


ソケットステータス

isClosed(); //接続が閉じられているかどうか、閉じられている場合はtrueを返し、それ以外の場合はfalseを返しますisConnect(); //以前に接続されていた場合はtrueを返します。それ以外の場合は return false

isBound(); //Socket がローカルポートにバインドされている場合は true を返し、それ以外の場合は false を返します


Socket が接続されているかどうかを確認したい場合は、次のステートメントが良い方法です。 。

boolean isConnection=socket.isConnected() && !socket.isClosed(); //接続が現在進行中かどうかを判断します


ソケットを半分閉じます

多くの場合、わかりません取得する入力ストリームの内容 読み取りを完了するまでにどのくらい時間がかかりますか?以下に一般的なメソッドをいくつか示します。


 カスタム識別子 (以下の例のように、「bye」文字列を受信したらソケットを閉じます)
  •  読み取り長を通知します (一部のカスタム プロトコル、最初の読み取り長を示すためにいくつかのバイトが固定されています)
  •  すべてのデータを読み取ります
  •  close呼び出し時にSocketが閉じられたら、その入出力ストリームを閉じます

ServerSocketコンストラクター

注:

1. バックログクライアント接続リクエストのキューの長さ。ポートが占有されている場合、または特定のポートを使用する権限がない場合は、BindException エラーがスローされます。たとえば、ポート 1 ~ 1023 には、管理者にバインドする権限が必要です。 3. ポートが 0 に設定されている場合、システムは自動的にポートを割り当てます。

4. bindAddr用于绑定服务器IP,为什么会有这样的设置呢,譬如有些机器有多个网卡。

5. ServerSocket一旦绑定了监听端口,就无法更改。ServerSocket()可以实现在绑定端口前设置其他的参数。 

单线程的ServerSocket例子 


public void service(){
  while(true){
    Socket socket=null;
    try{
      socket=serverSocket.accept();//从连接队列中取出一个连接,如果没有则等待
      System.out.println("新增连接:"+socket.getInetAddress()+":"+socket.getPort());
      ...//接收和发送数据
    }catch(IOException e){e.printStackTrace();}finally{
      try{
        if(socket!=null) socket.close();//与一个客户端通信结束后,要关闭Socket
      }catch(IOException e){e.printStackTrace();}
    }
  }
}
ログイン後にコピー

多线程的ServerSocket

多线程的好处不用多说,而且大多数的场景都是多线程的,无论是我们的即时类游戏还是IM,多线程的需求都是必须的。下面说说实现方式:

  •  主线程会循环执行ServerSocket.accept();

  •  当拿到客户端连接请求的时候,就会将Socket对象传递给多线程,让多线程去执行具体的操作;

实现多线程的方法要么继承Thread类,要么实现Runnable接口。当然也可以使用线程池,但实现的本质都是差不多的。

这里举例:

下面代码为服务器的主线程。为每个客户分配一个工作线程:


public void service(){
  while(true){
    Socket socket=null;
    try{
      socket=serverSocket.accept();            //主线程获取客户端连接
      Thread workThread=new Thread(new Handler(socket));  //创建线程
      workThread.start();                  //启动线程
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}
ログイン後にコピー

当然这里的重点在于如何实现Handler这个类。Handler需要实现Runnable接口:


class Handler implements Runnable{
  private Socket socket;
  public Handler(Socket socket){
    this.socket=socket;
  }
  
  public void run(){
    try{
      System.out.println("新连接:"+socket.getInetAddress()+":"+socket.getPort());
      Thread.sleep(10000);
    }catch(Exception e){e.printStackTrace();}finally{
      try{
        System.out.println("关闭连接:"+socket.getInetAddress()+":"+socket.getPort());
        if(socket!=null)socket.close();
      }catch(IOException e){
        e.printStackTrace();
      }
    }
  }
}
ログイン後にコピー

当然是先多线程还有其它的方式,譬如线程池,或者JVM自带的线程池都可以。这里就不说明了。

以上がJava でのソケット プログラミングの例を共有する (写真)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

コーディングの鍵: 初心者のための Python の力を解き放つ コーディングの鍵: 初心者のための Python の力を解き放つ Oct 11, 2024 pm 12:17 PM

Python は、学習の容易さと強力な機能により、初心者にとって理想的なプログラミング入門言語です。その基本は次のとおりです。 変数: データ (数値、文字列、リストなど) を保存するために使用されます。データ型: 変数内のデータの型 (整数、浮動小数点など) を定義します。演算子: 数学的な演算と比較に使用されます。制御フロー: コード実行のフロー (条件文、ループ) を制御します。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Oct 11, 2024 pm 08:58 PM

Python は、問題解決の初心者に力を与えます。ユーザーフレンドリーな構文、広範なライブラリ、変数、条件文、ループによる効率的なコード開発などの機能を備えています。データの管理からプログラム フローの制御、反復的なタスクの実行まで、Python が提供します

C の謎を解く: 新人プログラマーのための明確でシンプルな道 C の謎を解く: 新人プログラマーのための明確でシンプルな道 Oct 11, 2024 pm 10:47 PM

C は、初心者がシステム プログラミングを学習するのに最適な選択肢です。ヘッダー ファイル、関数、メイン関数のコンポーネントが含まれています。 「HelloWorld」を印刷できる単純な C プログラムには、標準入出力関数宣言を含むヘッダー ファイルが必要で、main 関数で printf 関数を使用して印刷します。 C プログラムは、GCC コンパイラーを使用してコンパイルして実行できます。基本をマスターしたら、データ型、関数、配列、ファイル処理などのトピックに進み、熟練した C プログラマーになることができます。

未来を創る: まったくの初心者のための Java プログラミング 未来を創る: まったくの初心者のための Java プログラミング Oct 13, 2024 pm 01:32 PM

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Java をシンプルに: プログラミング能力を高める初心者向けガイド Java をシンプルに: プログラミング能力を高める初心者向けガイド Oct 11, 2024 pm 06:30 PM

Java をシンプルに: プログラミング能力の初心者向けガイド はじめに Java は、モバイル アプリケーションからエンタープライズ レベルのシステムに至るまで、あらゆるもので使用される強力なプログラミング言語です。初心者にとって、Java の構文はシンプルで理解しやすいため、プログラミングの学習に最適です。基本構文 Java は、クラスベースのオブジェクト指向プログラミング パラダイムを使用します。クラスは、関連するデータと動作をまとめて編成するテンプレートです。簡単な Java クラスの例を次に示します。 publicclassperson{privateStringname;privateintage;

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

See all articles