<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java NIO學(xué)習(xí)-UDP的例子

    這幾天需要實(shí)現(xiàn)一個(gè)底層基于UDP的協(xié)議,該協(xié)議底層使用UDP傳輸?shù)蔷哂袚砣刂啤⒊瑫r(shí)重發(fā)、數(shù)據(jù)確認(rèn)等功能又比TCP簡(jiǎn)單 (RUDP,Reliable UDP)。在實(shí)現(xiàn)協(xié)議底層的UDP服務(wù)時(shí)準(zhǔn)備使用Java的NIO,在網(wǎng)上查資料都是以TCP為例講的,于是自己研究了一下基于UDP的NIO。

    NIO的思路是基于多路選擇的,即由原來(lái)的每個(gè)連接都由一個(gè)線程來(lái)等待消息,改為每個(gè)連接都在選擇器上注冊(cè),由選擇器來(lái)等待。當(dāng)然NIO引入了很多新的概念,如Channel,Buffer、Charset、Selector等,使得編程更簡(jiǎn)潔、更面向?qū)ο蠡?/font>

    下面貼出用NIO API改造成UDP示例代碼,注意其中使用Charset來(lái)編碼解碼的過(guò)程(當(dāng)然Charset還支持很多其他編碼不僅局限于默認(rèn)編碼)以及Buffer的使用。

    package sinpo.usagedemo;

    import java.net.DatagramSocket;
    import java.net.InetSocketAddress;
    import java.net.SocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.CharBuffer;
    import java.nio.channels.DatagramChannel;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.charset.Charset;
    import java.util.Iterator;
    import java.util.Set;

    /**
    * @author 徐辛波(sinpo.xu@hotmail.com) Oct 19, 2008
    */
    public class UDPServer extends Thread {
    public void run () {
    Selector selector = null ;
    try {
    DatagramChannel channel = DatagramChannel.open () ;
    DatagramSocket socket = channel.socket () ;
    channel.configureBlocking ( false ) ;
    socket.bind ( new InetSocketAddress ( 5057 )) ;

    selector = Selector.open () ;
    channel.register ( selector, SelectionKey.OP_READ ) ;
    } catch ( Exception e ) {
    e.printStackTrace () ;
    }

    ByteBuffer byteBuffer = ByteBuffer.allocate ( 65536 ) ;
    while ( true ) {
    try {
    int eventsCount = selector.select () ;
    if ( eventsCount > 0 ) {
    Set selectedKeys = selector.selectedKeys () ;
    Iterator iterator = selectedKeys.iterator () ;
    while ( iterator.hasNext ()) {
    SelectionKey sk = ( SelectionKey ) iterator.next () ;
    iterator.remove () ;
    if ( sk.isReadable ()) {
    DatagramChannel datagramChannel = ( DatagramChannel ) sk
    .channel () ;
    SocketAddress sa = datagramChannel
    .receive ( byteBuffer ) ;
    byteBuffer.flip () ;

    // 測(cè)試:通過(guò)將收到的ByteBuffer首先通過(guò)缺省的編碼解碼成CharBuffer 再輸出
    CharBuffer charBuffer = Charset.defaultCharset ()
    .decode ( byteBuffer ) ;
    System.out.println ( "receive message:"
    + charBuffer.toString ()) ;
    byteBuffer.clear () ;

    String echo = "This is the reply message from 服務(wù)器。" ;
    ByteBuffer buffer = Charset.defaultCharset ()
    .encode ( echo ) ;
    datagramChannel.write ( buffer ) ;
    }
    }
    }
    } catch ( Exception e ) {
    e.printStackTrace () ;
    }
    }

    }

    public static void main ( String [] args ) {
    new UDPServer () .start () ;
    }
    }
    Client
    package  sinpo.usagedemo;

    import  java.net.InetSocketAddress;
    import  java.net.SocketAddress;
    import  java.nio.ByteBuffer;
    import  java.nio.channels.DatagramChannel;
    import  java.nio.channels.SelectionKey;
    import  java.nio.channels.Selector;
    import  java.nio.charset.Charset;
    import  java.util.Iterator;
    import  java.util.Set;

    /**
      @author  徐辛波(sinpo.xu@hotmail.com)
      * Oct 19, 2008
      */
    public class  UDPClient  extends  Thread  {
         public  void  run () {
             DatagramChannel channel =  null ;
             Selector selector =  null ;
             try  {
                 channel = DatagramChannel.open () ;
                 channel.configureBlocking ( false ) ;
                 SocketAddress sa =  new  InetSocketAddress ( "localhost" 5057 ) ;
                 channel.connect ( sa ) ;
             catch  ( Exception e ) {
                 e.printStackTrace () ;
             }

             try  {
                 selector = Selector.open () ;
                 channel.register ( selector, SelectionKey.OP_READ ) ;
                 channel.write ( Charset.defaultCharset () .encode ( "Tell me your time" )) ;
             catch  ( Exception e ) {
                 e.printStackTrace () ;
             }
            
             ByteBuffer byteBuffer = ByteBuffer.allocate ( 100 ) ;
             while  ( true ) {
                 try  {
                     int  eventsCount = selector.select () ;
                     if  ( eventsCount >  0 ) {
                         Set selectedKeys = selector.selectedKeys () ;
                         Iterator iterator = selectedKeys.iterator () ;
                         while  ( iterator.hasNext ()) {
                             SelectionKey sk =  ( SelectionKey iterator.next () ;
                             iterator.remove () ;
                             if  ( sk.isReadable ()) {
                                 DatagramChannel datagramChannel =  ( DatagramChannel sk
                                         .channel () ;
                                 datagramChannel.read ( byteBuffer ) ;
                                 byteBuffer.flip () ;
                                
                                 //TODO 將報(bào)文轉(zhuǎn)化為RUDP消息并調(diào)用RUDP協(xié)議處理器來(lái)處理
                                
                                 System.out.println ( Charset.defaultCharset () .decode (
                                         byteBuffer ) .toString ()) ;
                                 byteBuffer.clear () ;
                                 datagramChannel.write ( Charset.defaultCharset ()
                                         .encode ( "Tell me your time" )) ;
                             }
                         }
                     }
                 catch  ( Exception e ) {
                     e.printStackTrace () ;
                 }
             }

         }
    }

    posted on 2008-10-20 22:38 徐辛波 閱讀(9336) 評(píng)論(11)  編輯  收藏 所屬分類: source pieces

    評(píng)論

    # re: Java NIO學(xué)習(xí)-UDP的例子 2008-10-22 20:47 楊愛(ài)友

    學(xué)習(xí)!  回復(fù)  更多評(píng)論   

    # re: Java NIO學(xué)習(xí)-UDP的例子 2008-10-23 17:41 yyk

    能不能把Client的代碼貼出來(lái) 謝謝  回復(fù)  更多評(píng)論   

    # re: Java NIO學(xué)習(xí)-UDP的例子 2008-10-23 20:10 徐辛波

    貼出來(lái)了 第一次可能是由于HTML原因沒(méi)有顯示出來(lái)。  回復(fù)  更多評(píng)論   

    # re: Java NIO學(xué)習(xí)-UDP的例子 2008-10-24 09:03 yyk

    非常感謝,小弟正在學(xué)習(xí)這方面的東西。再次感謝了!  回復(fù)  更多評(píng)論   

    # re: Java NIO學(xué)習(xí)-UDP的例子 2008-11-20 15:14 Mr.Right

    NIO用在UDP上沒(méi)必要吧
    他不是面向鏈接的 針對(duì)DatagramPacket就可以處理,然后再弄個(gè)DatagramSocket發(fā)送出去就OK了
    照你的寫法感覺(jué)--沒(méi)意義 沒(méi)有解決實(shí)際的問(wèn)題
    NIO 用在TCP上面還能夠減少線程 用在UDP上面就免了吧  回復(fù)  更多評(píng)論   

    # re: Java NIO學(xué)習(xí)-UDP的例子 2008-11-20 18:39 徐辛波

    @Mr.Right
    1、nio對(duì)讀寫提供了一致的抽象-都是面向channel進(jìn)行操作,使得對(duì)udp和tcp的操作更優(yōu)雅。
    2、udp監(jiān)聽(tīng)程序如果不用nio的selector機(jī)制則仍需要不間斷的輪詢是否有數(shù)據(jù)到達(dá);
    3、nio提供了ByteBuffer和CharSet等更易用的輔助類,udp程序轉(zhuǎn)到nio后能更方便的使用這些。  回復(fù)  更多評(píng)論   

    # re: Java NIO學(xué)習(xí)-UDP的例子 2008-12-25 14:18 有錯(cuò),無(wú)法回寫

    有錯(cuò),無(wú)法回寫  回復(fù)  更多評(píng)論   

    # re: Java NIO學(xué)習(xí)-UDP的例子 2009-03-10 15:36 ylq

    datagramChannel.write ( buffer ,sa) ;這樣就好了...初學(xué)者...不知道樓主是不是要這個(gè)意思....  回復(fù)  更多評(píng)論   

    # re: Java NIO學(xué)習(xí)-UDP的例子[未登錄](méi) 2009-06-11 16:06

    datagramChannel.read ( byteBuffer ) ;
    報(bào)錯(cuò)

    Java.net.PortUnreachableException  回復(fù)  更多評(píng)論   

    # re: Java NIO學(xué)習(xí)-ddddd[未登錄](méi) 2010-05-21 10:21 ddd

    ddd  回復(fù)  更多評(píng)論   

    # re: Java NIO學(xué)習(xí)-UDP的例子 2015-07-01 09:19 kwb

    @ylq
    應(yīng)該是send  回復(fù)  更多評(píng)論   

    導(dǎo)航

    <2008年10月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    統(tǒng)計(jì)

    • 隨筆 - 9
    • 文章 - 0
    • 評(píng)論 - 14
    • 引用 - 0

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    最新隨筆

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲熟女精品中文字幕| 亚洲综合色视频在线观看| 91高清免费国产自产| 无码免费一区二区三区免费播放| 香蕉免费看一区二区三区| 精品免费久久久久国产一区 | 无码欧精品亚洲日韩一区夜夜嗨| 永久免费视频v片www| 精品少妇人妻AV免费久久洗澡| 日韩激情淫片免费看| 在线观着免费观看国产黄| 国产免费av片在线播放| 日批日出水久久亚洲精品tv| 国产亚洲情侣一区二区无| 亚洲日韩精品A∨片无码| 久久精品国产精品亚洲蜜月| 亚洲毛片在线观看| 亚洲成人免费在线观看| 亚洲乱码一区二区三区国产精品| 亚洲中文字幕精品久久| 国产精品久久久久久亚洲影视| 免费精品久久久久久中文字幕| 国产一级a毛一级a看免费人娇| 免费的全黄一级录像带| 最近2019免费中文字幕视频三| 中文毛片无遮挡高潮免费| 好吊妞视频免费视频| 亚洲AV无码一区二三区 | 在线观看日本免费a∨视频| 最近免费中文字幕大全视频 | 国产在线观看www鲁啊鲁免费| 免费一级做a爰片性色毛片| 亚洲一区日韩高清中文字幕亚洲| 精品国产综合成人亚洲区| 亚洲va在线va天堂va不卡下载| 亚洲免费网站在线观看| 成a人片亚洲日本久久| 中文在线观看免费网站| 亚洲三级高清免费| 免费看国产精品麻豆| 婷婷亚洲综合五月天小说|