大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

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

Java實現(xiàn)socket長連接的方法

更新時間:2022-12-22 11:21:05 來源:動力節(jié)點 瀏覽4032次

長連接和短連接的概念

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

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

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

2.關(guān)閉流而保持Socket正常?

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

//發(fā)送核心方法
    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);
            }
            //進(jìn)行加密操作
            list = encry(list);
            Iterator<Integer> it = list.iterator();
            while(it.hasNext()){
                writer.write(it.next());
            }
            writer.flush();
            rtn = "發(fā)送成功!";
        }finally{
            //注意:直接關(guān)閉流將會導(dǎo)致socket關(guān)閉,只能通過shutdownOutput/input的方式關(guān)閉流
            //另外,流關(guān)閉之后,相當(dāng)于關(guān)閉底層的連接,除非新new個socket,否則和客戶端的連接相當(dāng)于斷開
//          if(writer!=null){
//              writer.close();
//          }
//          if(ow!=null){
//              ow.close();
//          }
//          if(os!=null){
                //os.close();
//          }
            //socket.shutdownOutput();流關(guān)閉之后,相當(dāng)于關(guān)閉底層的連接,除非新<br>new個socket,否則和客戶端的連接相當(dāng)于斷開
        }
        return rtn;
    }

長連接的正確實現(xiàn)方式

實現(xiàn)長連接的方法

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

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

下面貼上長連接實現(xiàn)后的代碼(其實就是比前面的代碼加多了讀入結(jié)束標(biāo)記符號)

//發(fā)送核心方法
    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);
            }
            //進(jìn)行加密操作
            list = encry(list);
            Iterator<Integer> it = list.iterator();
            while(it.hasNext()){
                writer.write(it.next());
            }
            //寫入結(jié)束標(biāo)志符號:%
            writer.write('%');
            writer.flush();
            rtn = "發(fā)送成功!";
        }finally{
            //注意:直接關(guān)閉流將會導(dǎo)致socket關(guān)閉,只能通過shutdownOutput/input的方式關(guān)閉流
            //另外,流關(guān)閉之后,相當(dāng)于關(guān)閉底層的連接,除非新new個socket,否則和客戶端的連接相當(dāng)于斷開
//          if(writer!=null){
//              writer.close();
//          }
//          if(ow!=null){
//              ow.close();
//          }
//          if(os!=null){
                //os.close();
//          }
            //socket.shutdownOutput();流關(guān)閉之后,相當(dāng)于關(guān)閉底層的連接,除非新new個socket,否則和客戶端的連接相當(dāng)于斷開
        }
        return rtn;
    }

短連接

每次關(guān)閉Socket和流時需要注意一下事情:

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

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

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 韩日免费视频 | 国产日产久久 | 亚洲免费在线 | 网色视频 | 天天做天天爱夜夜爽女人爽宅 | 日本高清二区 | 精品久久久久久中文字幕 | 国产一区二区三区久久精品 | 日本一级欧美一级中文 | 国四虎影永久 | 日韩欧美视频一区二区在线观看 | 奇米在线777在线视频 | 日韩图区 | 国产福利小视频在线观看 | 狠狠色狠狠色88综合日日91 | 奇米影视888狠狠狠777九色 | 国产精品视频分类一区 | 毛片免费观看视频 | 成人精品一区二区不卡视频 | 国产成人精品曰本亚洲78 | 成人免费一级毛片在线播放视频 | 久久精品国产欧美日韩亚洲 | 精品亚洲永久免费精品 | 久久爱噜噜噜噜久久久网 | 免费高清一级欧美片在线观看 | 夜色福利久久久久久777777 | 免费看羞羞视频的网站 | 国产一级一片免费播放 | 四虎影视色费永久在线观看 | 全黄h全肉边做边吃奶在线观看 | 激情一区二区三区成人 | 成人午夜在线 | 久久99精品久久久久久噜噜 | 中国大乳久久 | 日韩欧美高清视频 | 久久久久久免费观看 | 日日摸夜夜摸人人嗷嗷叫 | 美女被羞羞在线观看 | 日韩亚洲在线 | 亚洲精品国产不卡在线观看 | 99这里精品 |