Javaのソケットクライアントサーバードッキング正しい言葉遣い(BIO)

前ソケットクライアントとサーバのコードのいくつかの作品に書かれたが、それらを調査する時間がありませんでした、エラーだけではなく、1人の態度、その詳細の深い理解を持っていた、コードを書いたもの問題に気づいていないが、質問が露出してはならないので、ビジネスのためだけでなく、ドッキング側ドッキングコードは、行状況の外には表示されません。

まず、シングルスレッドのサーバがソケットBIOの練習で行うことにより、このアプローチは、サーバーにつながるだけ一方合計要求を受信することができ、パフォーマンスが非常に悪く、

今、私はBIOポストコードを見て、貧しい学生はを参照することができます

サーバー

パブリック クラスSocketIO {
     // クライアントコードは、クライアントとサーバは、特別な復号化を行うことなく、サーバ・プロセスを同じ符号化送信
    プライベート 静的 ファイナル「UTF-8」文字列CLIENTENCODEING = ;
     プライベート 静的 最終 INT PORT = 7777 ;
     プライベート 静的のAtomicIntegerの= COUNT 新しい新規のAtomicIntegerの(); 

    公共の 静的な 無効メイン(文字列[]引数)をスローにIOException { 
        ServerSocketをServerSocketを = 新しい新しいサーバーソケット(ポート)
        のSystem.out.println( "ポートを起動します" + PORT);
         一方、真の{)
            ソケットソケット = NULL ; 
            InputStream InputStreamは = NULL ; 
            のOutputStreamのOutputStream = NULL ;
             試み{
                 // ないデータブロックする、すなわち、データがイベントトリガ方法を受け入れる呼び出し受け入れる
                 // 接続になると、第二のシングルスレッドには、また次の読み取りにブロックされ、スレッドがもはやバック待ちの受け付けを継続することができるので、接続は、来ることができなかった 
                ソケット= serverSocket.accept();
                 int型 CCOUNT = count.incrementAndGet(); 
                System.out.printlnは(「新しいクライアントが接続され、現在の番号」+ CCOUNT +「」+ のSystem.currentTimeMillis())。

                inputStream = 新しいBufferedInputStreamを(socket.getInputStream()); 
                OutputStreamを = 新しいなBufferedOutputStream(socket.getOutputStream()); 

                // 读取正文内容
                バイト []フラッシュ= 新しい バイト [1024 ];
                int型の長さ= 0 
                StringBuffer REC = 新しいStringBufferを();
                一方、(!(長さ= inputStream.read(フラッシュ))= -1 ){ 
                    rec.append(新しい文字列(フラッシュ、0 、長さ))。
                } 
                //2書き込み
                 // この方法に従うことによって、この方法は、型閉サイクルを通知しない、しながら読み込む;)クライアントをsocket.shutdownOutputを(オフ通知されない
                 // 読み取りおよび書き込み操作は、この方法は、第1のデータストリームの前に知ることができる)(利用していますどのように多くのバイトを読み取ることができます
                 。// しかし、クライアントはバッチが問題かもしれ送信する場合、データの取得とその後の第二のバッチではないかもしれない
                 // それは、クライアントが知らさせた方がよいでしょう
 //                 int型のCOUNT = 0;
 //                 一方、(COUNT == 0){
 //                     COUNT = inputStream.available();
 //                 }
 //                 バイト[] =フラッシュ新しい新しいバイト[COUNT];
 //                 InputStream.read(フラッシュ);
 //                 文字列新しい新しいREC = (フラッシュ、0、カウント、CLIENTENCODEING )。

                バック文字列 = "[" CCOUNT + + "]" + UUID.randomUUID()+ "" ; 
                のSystem.out.println( "受信データ:" + rec.toString()+ "データを返すことについて:" + 戻ります)。
                 // 戻りデータ 
                OutputStream.write(back.getBytes()、0 、back.getBytes()の長さ。); 
                outputStream.flush(); 
            } キャッチ(例外E){ 
                e.printStackTrace(); 
            } 最後に{ 
                閉じる(ソケット値、INPUTSTREAM、のOutputStream)。
            } 
        } 
    } 

    プライベート 静的 ボイド近い(ソケットソケット、
            InputStream InputStreamは、
            のOutputStreamのOutputStream)がスローにIOException {
         もし!(OutputStreamを= NULL ){ 
            outputStream.close()。
        } 
        もし(!のinputStream = NULL ){ 
            inputStream.close()。
        } 
        もし(!ソケット= NULL ){ 
            socket.close()。
        } 
    } 
}

列のいくつかのポイントには注意が必要です。

読み出し方法により読み出さ1は、好ましくは、クライアントのコンテンツによって利用可能なコードは、私は、クライアントは、メッセージが信頼できない、複数回送信失う見つかった場合に送信されます。

2、OutputStreamを使用して、入力ストリームのストリームバッファ*ストリームバッファによってベストフィットです

3、書き込み後にフラッシュすることを忘れないでください

図4に示すように、ストリームを閉じます

クライアント

  // 服务端编码
    プライベート 静的な 最終文字列SERVERENCODEING = "UTF-8" ; 

    パブリック 静的 ボイド(文字列[]引数){主
         のためint型 ; <; I ++は1私= 0 {)
             新しい -スレッド(()> {
                 試み{ 
                    DOO(); 
                } キャッチ(IOExceptionを電子){ 
                    e.printStackTrace( ); 
                } 
            }))(始めます。
        } 
    } 

    パブリック 静的 ボイド DOO()はスロー{のIOException 
        ソケットソケット = ヌル; 
        でのInputStream = ヌル; 
        OutputStreamのOUT = ヌル; 
        文字列MSGは =「良いハローハローハロー!」;
         試み{
             //は、データ送信 
            ソケット= 新しい新しいソケット(「127.0.0.1」、7777 ) ; 
            OUT = 新しい新規なBufferedOutputStream(Socket.getOutputStream());  = 新しい新たにBufferedInputStream(Socket.getInputStream()); 
            out.write(Msg.getBytes())。 
            out.flush(); 

            out.write(「少し」.getBytes()); 
            out.flush(); 
//             // 近い入力ストリームまたは出力ストリーム()のどれが近い近いがないソケットを引き起こし、サーバが受信できない原因になります-1
 //             )(out.close; 
            socket.shutdownOutput(); 

            // テキストコンテンツ読み取る
            バイト [] =フラッシュ新しい新しい バイト [1024 ];
             int型の長さ= 0 ; 
            StringBufferのREC = 新しい新;たStringBuffer()
             一方、(( != in.read長さ(面一))= -1 ){ 
                rec.append(新しい新しい文字列(フラッシュ、0、長さ、SERVERENCODEING)); //標準コーディングサーバ送信中
){             }
            System.out.println( "客户端收到回复:" + rec.toString()); 
            in.close(); 
            socket.close(); 
        } キャッチ(IOExceptionを電子){ 
            e.printStackTrace(); 
        } 最後に、{ 
            (ソケット、IN、OUT)近いです。
        } 
    } 

    プライベート 静的 ボイド近い(ソケットソケット、
                              InputStream InputStreamは、
                              のOutputStreamのOutputStream)スローにIOException {
         場合(OutputStreamを=!ヌル
            outputStream.close()。
        } 
        もし(!のinputStream = NULL ){ 
            inputStream.close()。
        } 
        もし(!ソケット= NULL ){ 
            socket.close()。
        } 
    }

列のいくつかのポイントには注意が必要です。

1、out.close();任意の入力ストリームまたは出力ストリームのクローズは、()閉じる閉じるソケットが発生しますが、ターンを受け取ることができないではないサービスは、につながる-1

2、socket.shutdownOutput()を使用して、サーバから送信された通知が完了し

3、書き込み後にフラッシュすることを忘れないでください

図4に示すように、ストリームを閉じます

おすすめ

転載: www.cnblogs.com/zxporz/p/10972727.html