無為

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

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks
          [程序設(shè)計]

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

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

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

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

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

              數(shù)據(jù)接收線程Receiver.java的任務(wù)是接收廣播數(shù)據(jù)并更新圖形用戶界面。該類
          的構(gòu)造函數(shù)包括兩個參數(shù),參數(shù)listener指定用來接收數(shù)據(jù)的Broadcast對象,參數(shù)
          display則指定用來顯示會議內(nèi)容的TextArea對象。在其運(yùn)行方法run 中,循環(huán)調(diào)用
          Broadcast對象的數(shù)據(jù)接收方法ReceiveData 接收廣播數(shù)據(jù),并且利用TextArea對象
          的append方法將新接收到的內(nèi)容顯示到圖形用戶界面上。

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

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

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


          [程序測試]

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

              javac *.java

              啟動網(wǎng)絡(luò)會議程序:

              java Chat

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


          [結(jié)論]

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


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

          posted on 2005-12-14 13:21 草兒 閱讀(321) 評論(0)  編輯  收藏 所屬分類: Java編程經(jīng)驗談
          主站蜘蛛池模板: 临清市| 临澧县| 遵化市| 稻城县| 鄄城县| 时尚| 云龙县| 宿州市| 文水县| 桂东县| 大埔县| 湟中县| 广西| 平顺县| 奉新县| 宜黄县| 光泽县| 枣强县| 凌海市| 梅河口市| 弋阳县| 长乐市| 黔江区| 威远县| 安徽省| 萍乡市| 永靖县| 阳江市| 视频| 平安县| 通辽市| 平利县| 静乐县| 田阳县| 固阳县| 绍兴县| 灵山县| 开鲁县| 张家口市| 确山县| 桂东县|