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

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

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

    無為

    無為則可為,無為則至深!

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks
    [程序設計]

        數據廣播與接收模塊Broadcast.java是本示例程序的核心部分。該類包括一個
    構造方法,一個數據發送方法和一個數據接收方法。為了使這個類能夠被更加廣泛
    的應用到其它應用程序中,作者又添加了一個端口配置方法。

        在構造方法中,我們首先利用InetAddress 定義一個數據廣播組,同時構造一
    個用于發送數據的DatagramSocket與一個用于接收數據的MulticastSocket。 在這
    里我們使用230.0.0.1 來作為數據廣播組的標示符,雖然這個標示符與IP地址的格
    式相同,但是它并不表示Internet上的一臺機器。此外,我們在端口配置方法中分
    別指定1235端口和1236端口位數據發送和數據接收端口。如果把一個UDP 數據廣播
    系統比喻成無線電廣播系統的話,數據廣播標示符可以被認為是波段,而數據接收
    端口可以被認為是頻率。收音機用戶必須把收音機調整到相應的波段和頻率才能夠
    接收到電臺信號,我們的UDP 數據接收程序也必須加入相對應的數據廣播組并且使
    用正確的數據接收端口才能夠正確的接收到UDP 廣播數據。在構造方法中,我們利
    用MulticastSocket 的構造函數指定數據接收端口(頻率),并利用其joinGroup 方
    法指定數據廣播組(波段)。

        public Broadcast()
        {
            GetBroadcastPorts();
            try
            {
                    // 構造數據廣播組標示符 (波段)
                    BroadcastGroup = InetAddress.getByName("230.0.0.1");
                    // 構造數據發送端口
                    Sender         = new DatagramSocket(ServerPort);
                    // 構造數據接收端口 (頻率)
                    Receiver       = new MulticastSocket(ClientPort);
                    // 指定數據接收端口的數據廣播組 (波段)
                    Receiver.joinGroup(BroadcastGroup);
            } catch (Exception e) {}
        }

        在數據發送方法中,我們基于用戶所提供的數據以及數據廣播目甓絲?頻率)
    構造一個DatagramPacket數據包,然后利用發送數據的DatagramSocket的send方法
    將該數據包發送到局域網。與此相反,在數據接收方法中,我們首先構造一個空的
    DatagramPacket數據包,然后利用接收數據的MulticastSocket的receive方法填充
    該數據包中的內容。為了避免由于數據包大小不同所造成的數據丟失等麻煩,我們
    特地將兩個數據包的大小設置成一樣的。

        // 數據發送方法
        public void SendData(String Msg)
        {
            byte[] b = new byte[1024];
            DatagramPacket packet;
            try
            {
                // 字節序列b 包括需要發送的數據
                b = Msg.getBytes();
                // 構造一個數據包,BroadcastGroup是數據廣播組標示符(波段),
                // ClientPort是數據廣播目標端口(頻率)。
                packet = new DatagramPacket(b, b.length, BroadcastGroup, ClientPort);
                // 發送數據包
                Sender.send(packet);
            } catch (Exception e) {}
        }
        
        // 數據接收方法
        public String ReceiveData()
        {
            byte[] b = new byte[1024];
            // 構造一個空的數據包
            DatagramPacket packet = new DatagramPacket(b, 1024);
            String InMsg;           
            try
            {
                    // 接收數據
                    Receiver.receive(packet);
            } catch (IOException e) {}
            // 叢數據包中獲得接收到的數據
            b = packet.getData();
            InMsg = new String(b);
            return InMsg;   
        }

        數據接收線程Receiver.java的任務是接收廣播數據并更新圖形用戶界面。該類
    的構造函數包括兩個參數,參數listener指定用來接收數據的Broadcast對象,參數
    display則指定用來顯示會議內容的TextArea對象。在其運行方法run 中,循環調用
    Broadcast對象的數據接收方法ReceiveData 接收廣播數據,并且利用TextArea對象
    的append方法將新接收到的內容顯示到圖形用戶界面上。

    public class Receiver extends Thread
    {
            Broadcast Listener;
            TextArea  Display;
            String    InMsg;
            
            // 構造方法
            public Receiver(Broadcast listener, TextArea display )
            {
                    // Listener 是一個數據發送與接收對象,用來接收數據。
                    Listener = listener;
                    / Display是一個TextArea對象,用來顯示會議內容。
                    Display  = display;
            }
            
            // 運行方法
            public void run()
            {
                    while(true)
                    {
                            // 接收廣播數據
                            InMsg = Listener.ReceiveData();
                            // 更新圖形用戶界面
                            Display.append(InMsg);
                            Display.append("\n");
                    }
            }
    }

        圖形用戶界面chat.java是基于Java抽象窗口工具包AWT構建的。該界面包括一個
    用來顯示會議內容TextArea,一個用來接收用戶輸入的TextField ,以及一個數據發
    送命令按鈕。在Chat的構造方法中,我們首先創建圖形界面,構造一個數據發送與接
    收對象和一個數據接收線程,然后啟動該線程開始接收會議信息。在這個方法中,我
    們還利用InetAddress.getLocalHost()方法來獲得用戶的機器名,這個標示符被用來
    作為用戶在網絡會議中的用戶名。

            // 構造方法
            public Chat()
            {
                    // 創建圖形界面
                    add(CreateGui());
                    // ....
                    // 其它操作
                    // ....
                    // 構造一個數據發送與接收對象
                    Device = new Broadcast();
                    // 構造一個數據接收線程
                    Receiver Recv = new Receiver(Device, InMsg);
                    Recv.start();
            }


    [程序測試]

        利用JDK 1.3編譯以上所有源代碼:

        javac *.java

        啟動網絡會議程序:

        java Chat

        本示例程序在一個包括Windows 98,Windows 2000,Red Hat Linux 6.1/7.0,
    Mac OS,Sun Solaris等多種操作系統的局域網絡中通過測試。


    [結論]

        本文介紹了網絡通訊中通用的傳輸控制協議(TCP)和用戶數據包協議(UDP),并
    且利用Java語言設計了一個簡單的基于UDP 數據廣播的局域網絡會議程序,展示了
    在Java語言中進行UDP 數據發送和接收的一般步驟。本示例程序說明利用UDP 數據
    廣播能夠輕易實現局域網絡會議的一般功能。由于Java語言卓越的跨平臺特性,一
    個基于Java的局域網絡會議系統夠不加修改的運行在一系列不同平臺上。


    凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
    、轉載請注明來處和原文作者。非常感謝。

    posted on 2005-12-14 13:21 草兒 閱讀(320) 評論(0)  編輯  收藏 所屬分類: Java編程經驗談
    主站蜘蛛池模板: 日本高清高色视频免费| 国产亚洲av片在线观看18女人| 中国性猛交xxxxx免费看| 亚洲欧洲日本在线观看| 亚洲国产综合专区电影在线| 亚洲精品国产V片在线观看 | 国产免费看插插插视频| 999国内精品永久免费视频| 女人隐私秘视频黄www免费| 日韩色日韩视频亚洲网站 | 99爱视频99爱在线观看免费| 国产V片在线播放免费无码| 国产亚洲视频在线| 亚洲色最新高清av网站| 亚洲国产精品久久久久秋霞影院| 久久久久久久尹人综合网亚洲| 日韩亚洲国产二区| 国产男女猛烈无遮档免费视频网站 | 国产情侣久久久久aⅴ免费| 又硬又粗又长又爽免费看 | 国产亚洲中文日本不卡二区| 亚洲欧洲日韩在线电影| 亚洲卡一卡2卡三卡4卡无卡三| 亚洲日韩精品无码一区二区三区| 亚洲M码 欧洲S码SSS222| 四虎永久免费地址在线网站| 色www永久免费视频| 成人免费淫片在线费观看| 国产成在线观看免费视频| 动漫黄网站免费永久在线观看| 免费黄色福利视频| 91频在线观看免费大全| 亚洲精品免费在线| xxxxwww免费| 日韩免费精品视频| 特级做A爰片毛片免费69| 毛片免费视频播放| 免费无码又爽又高潮视频| 国产精品免费看香蕉| 国产乱子影视频上线免费观看| 免费一级做a爰片久久毛片潮喷|