リアルタイムアプリケーションまたはリアルタイムゲームの場合、HTTPプロトコルは多くの場合、ニーズを満たすことができません。ソケットは私たちにとって非常に実用的です。以下は、この研究のメモです。主に、例外型、相互作用原理、ソケット、サーバーソケット、およびマルチスレッドの側面を説明しています。
例外タイプ
ソケットのコンテンツを理解する前に、関連するいくつかの例外タイプを理解する必要があります。次の4つのタイプはすべてiOExceptionから継承されているため、その後多くのioExceptionが直接ポップアップ表示されます。
unkonhostexception:ホスト名またはIPエラー
ConnectException:サーバーは接続を拒否し、サーバーは起動しません(キューの数が超え、接続が拒否されます)
sockettimeoutexception:接続タイムアウト
bindexception:ソケットオブジェクトは、定式化されたローカルIPアドレスまたはポートにバインドできません
相互作用プロセス
次の写真が詳細に説明されていると思います。
ソケット
コンストラクタ
socket()socket(inetaddressアドレス、intポート)unknownhostexception、ioexceptionsocket(inetaddressアドレス、int port、inetAddress localadress、int localport)スローIoExceptionsocket(string host、int port)throws nownowshostexception、ioExceptionsocketsocket、intaddressdressdressdressdressdressodressoctionsockent、intaddressdressodressceptionsocket(
パラメーターのない最初のものを除き、他のコンストラクターはサーバーへの接続を確立しようとします。失敗した場合、IOExceptionエラーがスローされます。成功した場合、ソケットオブジェクトが返されます。
InetAddressは、ホストを記録するために使用されるクラスです。その静的gethostbyname(String MSG)はインスタンスを返すことができ、その静的メソッドgetLocalHost()は現在のホストのIPアドレスを取得してインスタンスを返すこともできます。ソケット(String Host、Int Port、InetAddress localAddress、int localport)のパラメーターは、ターゲットIP、ターゲットポート、ローカルIP、およびローカルポートです。
ソケット方式
getinetAddress();リモートサーバーのIPアドレス
getport();リモートサーバーのポート
getLocalAddress()ローカルクライアントのIPアドレス
getLocalPort()ローカルクライアントのポート
getInputStream(); getInputStream();
getoutstream();出力ストリームを取得します
これらの方法の中で、最も重要な方法はgetInputStream()とgetOutputStream()であることに注意してください。
ソケットステータス
isclosed(); //接続は閉じられていますか?閉じた場合は、trueを返します。それ以外の場合は、falseを返します
isconnect(); //接続されている場合はtrueを返します。それ以外の場合はfalseを返します
isbound(); //ソケットがローカルポートにバインドされている場合、trueを返します。それ以外の場合は、falseを返します
ソケットのステータスが接続されているかどうかを確認したい場合は、次のステートメントを判断する良い方法です。
boolean isconnection = socket.isconnected()&&!socket.isclosed(); //現在関連しているかどうかを判断します
半閉鎖されたソケット
多くの場合、取得した入力ストリームで終了するのにどれくらいの時間がかかるかわかりません。いくつかの一般的な方法は次のとおりです。
Serversocket
コンストラクタ
serversocket()スローioexceptionserversocket(int port)throws ioexceptionserversocket(int port、int backlog)throws ioexceptionserversockets(int port、int backlog、inetaddress bindaddr)IoException
注記:
1.ポートサーバーが聴くポート。バックログクライアント接続要求のキュー長。 bindaddrサーバーはIPにバインドします
2.ポートが占有されている場合、または特定のポートを使用する許可がない場合、BindExceptionエラーがスローされます。たとえば、1〜1023のポートでは、管理者が許可拘束力を持たせる必要があります。
3.ポートが0に設定されている場合、システムはポートを自動的に割り当てます。
4. bindaddrは、サーバーIPをバインドするために使用されます。なぜそのような設定があるのですか?たとえば、一部のマシンには複数のネットワークカードがあります。
5.サーバーソケットがリスニングポートにバインドされると、変更できません。 Serversocket()は、ポートをバインドする前に他のパラメーターを設定できます。
シングルスレッドサーバーソケットの例
public void service(){while(true){socket socket = null; try {socket = serversocket.accept(); //接続キューから接続を取得します。 ... //データを受信して送信} catch(ioexception e){e.printstacktrace();}最後に{try {try {try(socket!= null)socket.close(); //クライアントとの通信後、close socket e){e.printstacktrace();}}}}}}マルチスレッドサーバーソケット
言うまでもなく、マルチスレッドの利点はマルチスレッドであり、ほとんどのシナリオはマルチスレッドです。それが私たちのリアルタイムゲームであろうとIMであろうと、マルチスレッドのニーズが必要です。以下の実装方法について話しましょう。
マルチスレッドを実装する方法スレッドクラスを継承するか、実行可能なインターフェイスを実装します。もちろん、スレッドプールも使用できますが、実装の本質は似ています。
これが例です:
次のコードは、サーバーのメインスレッドです。各クライアントにワーカースレッドを割り当てます。
public void service(){while(true){socket socket = null; try {socket = serversocket.accept(); //メインスレッドはクライアント接続スレッドworkthread = newスレッド(new Handler(socket))を取得します。 // thread workthread.start();を作成します。 //スレッドを起動} catch(例外e){e.printstacktrace(); }}}もちろん、ここでの焦点は、ハンドラークラスの実装方法にあります。ハンドラーは、実行可能なインターフェイスを実装する必要があります。
クラスハンドラーはrunnable {プライベートソケットソケット;パブリックハンドラー(ソケットソケット){this.socket = socket; } public void run(){try {system.out.println( "new Connection:"+socket.getinetAddress()+":"+socket.getport()); thread.sleep(10000); } catch(Exception e){e.printstacktrace();}最後に{try {system.out.println( "接続を閉じる:"+socket.getinetaddress()+":"+socket.getport()); if(socket!= null)socket.close(); } catch(ioexception e){e.printstacktrace(); }}}}もちろん、最初にマルチスレッドには、JVMに組み込まれているスレッドプールやスレッドプールなど、他の方法があります。ここでは説明しません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。