Java でのソケット プログラミングの例を共有する (写真)
ソケットは私たちにとって非常に実用的です。以下はこの研究のためのメモです。これは主に、例外タイプ、対話原則、ソケット、サーバーソケット、およびマルチスレッドに分かれています。リアルタイム アプリケーションやリアルタイム ゲームの場合、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 オブジェクトが返されます。
getInetAddress(); リモートサーバーのIPアドレスgetPort(); リモートサーバーのポート
getLocalAddress() ローカルクライアントのIPアドレスgetLocalPort()ローカルクライアントの
getInputStream() ; 入力ストリームを取得する
getOutStream(); 出力ストリームを取得する
これらのメソッドの中で、最も重要なものは getInputStream() と getOutputStream() であることに注意してください。
isClosed(); //接続が閉じられているかどうか、閉じられている場合はtrueを返し、それ以外の場合はfalseを返しますisConnect(); //以前に接続されていた場合はtrueを返します。それ以外の場合は return false
isBound(); //Socket がローカルポートにバインドされている場合は true を返し、それ以外の場合は false を返します
Socket が接続されているかどうかを確認したい場合は、次のステートメントが良い方法です。 。
多くの場合、わかりません取得する入力ストリームの内容 読み取りを完了するまでにどのくらい時間がかかりますか?以下に一般的なメソッドをいくつか示します。
- 読み取り長を通知します (一部のカスタム プロトコル、最初の読み取り長を示すためにいくつかのバイトが固定されています)
- すべてのデータを読み取ります
- close呼び出し時にSocketが閉じられたら、その入出力ストリームを閉じます
-
注:
1. バックログクライアント接続リクエストのキューの長さ。ポートが占有されている場合、または特定のポートを使用する権限がない場合は、BindException エラーがスローされます。たとえば、ポート 1 ~ 1023 には、管理者にバインドする権限が必要です。 3. ポートが 0 に設定されている場合、システムは自動的にポートを割り当てます。 4. bindAddr用于绑定服务器IP,为什么会有这样的设置呢,譬如有些机器有多个网卡。 5. ServerSocket一旦绑定了监听端口,就无法更改。ServerSocket()可以实现在绑定端口前设置其他的参数。 单线程的ServerSocket例子 多线程的ServerSocket 多线程的好处不用多说,而且大多数的场景都是多线程的,无论是我们的即时类游戏还是IM,多线程的需求都是必须的。下面说说实现方式: 主线程会循环执行ServerSocket.accept(); 当拿到客户端连接请求的时候,就会将Socket对象传递给多线程,让多线程去执行具体的操作; 实现多线程的方法要么继承Thread类,要么实现Runnable接口。当然也可以使用线程池,但实现的本质都是差不多的。 这里举例: 下面代码为服务器的主线程。为每个客户分配一个工作线程: 当然这里的重点在于如何实现Handler这个类。Handler需要实现Runnable接口: 当然是先多线程还有其它的方式,譬如线程池,或者JVM自带的线程池都可以。这里就不说明了。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();}
}
}
}
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();
}
}
}
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();
}
}
}
}
以上がJava でのソケット プログラミングの例を共有する (写真)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック

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

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

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

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

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

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

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

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