黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java實現socket長連接的方法

Java實現socket長連接的方法

更新時間:2022-12-22 11:21:05 來源:動力節點 瀏覽4246次

長連接和短連接的概念

1.長連接與短連接的概念:

前者是整個通訊過程,客戶端和服務端只用一個Socket對象,長期保持Socket的連接;后者是每次請求,都新建一個Socket,處理完一個請求就直接關閉掉Socket。所以,其實區分長短連接就是:整個客戶和服務端的通訊過程是利用一個Socket還是多個Socket進行的。

可能你會想:這還不簡單,長連接不就是不關Socket嘛,短連接不就是每次都關Socket每次都new Socket嘛。然而事實其實并沒有那么簡單的。

2.關閉流而保持Socket正常?

在網上百度了一下,發現很多人都是以關閉流還是關閉Socket來區分長連接和短連接的,其實,這種區分方法并沒有什么意義:因為這里面有一個事實是,流關閉之后,便不能進行消息的發送(對應關閉輸出流)或者接受(對應關閉輸入流),因為其實關閉了對應的流,對應連接也就關閉了(這里所說的連接是發送消息的通道!),所以,流關閉而保持Socket開啟,是沒有達到長連接的效果,貼上測試代碼:

//發送核心方法
    public String send(String send) throws IOException {
        String rtn = null;
        BufferedWriter writer = null;
        OutputStreamWriter ow = null;
        OutputStream os = null;
        try{
            os = socket.getOutputStream();
            ow = new OutputStreamWriter(os);
            writer = new BufferedWriter(ow);
            char [] sendChar = send.toCharArray();
            ArrayList<Integer> list = new ArrayList<Integer>();
            for(char ch:sendChar){
                list.add((int)ch);
            }
            //進行加密操作
            list = encry(list);
            Iterator<Integer> it = list.iterator();
            while(it.hasNext()){
                writer.write(it.next());
            }
            writer.flush();
            rtn = "發送成功!";
        }finally{
            //注意:直接關閉流將會導致socket關閉,只能通過shutdownOutput/input的方式關閉流
            //另外,流關閉之后,相當于關閉底層的連接,除非新new個socket,否則和客戶端的連接相當于斷開
//          if(writer!=null){
//              writer.close();
//          }
//          if(ow!=null){
//              ow.close();
//          }
//          if(os!=null){
                //os.close();
//          }
            //socket.shutdownOutput();流關閉之后,相當于關閉底層的連接,除非新<br>new個socket,否則和客戶端的連接相當于斷開
        }
        return rtn;
    }

長連接的正確實現方式

實現長連接的方法

A.客戶端自動退出開讀取的動作。前面說了,就算服務端調用了flush方法進行輸出刷新,客戶端也不一定能退出read的動作,所以還是會阻塞。所以,退出動作必須有客戶端程序自己完成,我們可以在服務端沒發送完一段消息并且刷新前就進行一個寫入結束符號的標志,客戶端解析到結束符號時,變可直接退出read的循環讀取操作,避免一直阻塞。

B.可以調用有讀取一定字節到某個數組的read方法(不過好像這個不太行,畢竟每次消息的長度好像會變的),當然,這只是針對消息定長的情況。

下面貼上長連接實現后的代碼(其實就是比前面的代碼加多了讀入結束標記符號)

//發送核心方法
    public String send(String send) throws IOException {
        String rtn = null;
        BufferedWriter writer = null;
        OutputStreamWriter ow = null;
        OutputStream os = null;
        try{
            os = socket.getOutputStream();
            ow = new OutputStreamWriter(os);
            writer = new BufferedWriter(ow);
            char [] sendChar = send.toCharArray();
            ArrayList<Integer> list = new ArrayList<Integer>();
            for(char ch:sendChar){
                list.add((int)ch);
            }
            //進行加密操作
            list = encry(list);
            Iterator<Integer> it = list.iterator();
            while(it.hasNext()){
                writer.write(it.next());
            }
            //寫入結束標志符號:%
            writer.write('%');
            writer.flush();
            rtn = "發送成功!";
        }finally{
            //注意:直接關閉流將會導致socket關閉,只能通過shutdownOutput/input的方式關閉流
            //另外,流關閉之后,相當于關閉底層的連接,除非新new個socket,否則和客戶端的連接相當于斷開
//          if(writer!=null){
//              writer.close();
//          }
//          if(ow!=null){
//              ow.close();
//          }
//          if(os!=null){
                //os.close();
//          }
            //socket.shutdownOutput();流關閉之后,相當于關閉底層的連接,除非新new個socket,否則和客戶端的連接相當于斷開
        }
        return rtn;
    }

短連接

每次關閉Socket和流時需要注意一下事情:

1.雖然前面說了流關閉了,Socket就不可用了,但是,我們還是要顯式的關閉Socket的,因為在Socekt中還有中狀態:叫做半連接狀態,當我們只是用到輸出流的時候,我們關閉了輸出流,并且不能直接調用close方法,只能調用shutDown對應方法(具體請查看java API),其實輸入流還是連接著的(只是我們沒有用到而已!),這時候,如果沒有顯式關閉Soceket,很容易導致內存泄露,所以,所有流Socket都要顯式關閉

2.短連接和長連接有不同的用途:對于某次服務只需要一次回話的客戶,使用短連接顯得簡單;但是,如果該次服務需要很多交互式的操作通信,那還是長連接比較高性能,畢竟,Socket的打開和關閉都是很耗性能的。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 久久综合色婷婷 | 性欧美videos另类视频 | 午夜免费看 | 欧美人妖xxx | 天天操综合视频 | 你懂的免费| 国产亚洲成归v人片在线观看 | 老湿影院免费体验区 | 欧美国产小视频 | 免费一级黄色录像 | 国产亚洲欧美另类一区二区三区 | 一个人免费播放在线视频看片 | 欧美色综合高清视频在线 | 丝袜美腿在线 | 天堂在线中文网 | 特级毛片s级全部免费 | 国产黄色在线网站 | 亚洲第一伊人 | 99手机在线视频 | 亚洲爆爽| 黄站在线观看 | 日本丝袜护士 | 国产精品hd| 最近中文字幕2019高清8? | 欧美中文字幕一二三四区 | 欧美专区亚洲专区 | 碰超在线观看 | 一级毛片免费毛片毛片 | 亚洲成综合人影院在院播放 | 精品一区二区三区中文 | 精品导航第一导航 | 亚洲欧美日本韩国综合在线观看 | 免费777my性欧美另类 | 看黄的视频| 精品国产一区二区三区麻豆小说 | 国产综合免费视频 | 成人免费国产欧美日韩你懂的 | 欧美性猛交xxxx免费看蜜桃 | 亚洲国产二区三区久久 | 成人高清视频在线观看大全 | 男女一级做片a性视频 |