友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第179章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




      System。exit(1);  

    }  

    try {  

      socket =  

        new DatagramSocket(COLLECTOR_PORT);  

      System。out。println(  

        〃NameCollector Server started〃);  

      while(true) {  

        // Block until a datagram appears:  

        socket。receive(dp);  

        String rcvd = new String(dp。getData();  

            0; 0; dp。getLength());  

        // Send to listmgr。exe standard input:  

        nameList。println(rcvd。trim());  

        nameList。flush();  

        byte'' resultBuf = new byte'BUFFER_SIZE';  

        int byteCount =   

          addResult。read(resultBuf);  

        if(byteCount != …1) {  

          String result =   

            new String(resultBuf; 0)。trim();  

          // Extract the address and port from   

          // the received datagram to find out   

          // where to send the reply:  

          InetAddress senderAddress =  

            dp。getAddress();  

          int senderPort = dp。getPort();  

          byte'' echoBuf = new byte'BUFFER_SIZE';  

          result。getBytes(  

            0; byteCount; echoBuf; 0);  

          DatagramPacket echo =  

            new DatagramPacket(  

              echoBuf; echoBuf。length;  

              senderAddress; senderPort);  

          socket。send(echo);  

        }  

        else  

          System。out。println(  

            〃Unexpected lack of result from 〃 +  

            〃listmgr。exe〃);  

      }  

    } catch(SocketException e) {  

      System。err。println(〃Can't open socket〃);  



                                                                                          555 


…………………………………………………………Page 557……………………………………………………………

      System。exit(1);  

    } catch(IOException e) {  

      System。err。println(〃munication error〃);  

      e。printStackTrace();  

    }  

  }  

  public static void main(String'' args) {  

    new NameCollector();  

  }  

} ///:~  

  

NameCollector 中的第一个定义应该是大家所熟悉的:选定端口,创建一个数据报包,然后创建指向一个 

DatagramSocket 的句柄。接下来的三个定义负责与C 程序的连接:一个 Process 对象是 C 程序由 Java 程序 

启动之后返回的,而且那个Process 对象产生了 InputStream 和OutputStream,分别代表 C 程序的标准输出 

和标准输入。和Java IO 一样,它们理所当然地需要“封装”起来,所以我们最后得到的是一个 

PrintStream 和 DataInputStream。  

这个程序的所有工作都是在构建器内进行的。为启动C 程序,需要取得当前的 Runtime 对象。我们用它调用 

exec(),再由后者返回Process 对象。在Process 对象中,大家可看到通过一简单的调用即可生成数据流: 

getOutputStream()和 getInputStream()。从这个时候开始,我们需要考虑的全部事情就是将数据传给数据 

流nameList ,并从addResult 中取得结果。  

和往常一样,我们将DatagramSocket 同一个端口连接到一起。在无限while 循环中,程序会调用 

receive()——除非一个数据报到来,否则receive()会一起处于“堵塞”状态。数据报出现以后,它的内容 

会提取到String rcvd 里。我们首先将该字串两头的空格剔除(trim),再将其发给C 程序。如下所示:  

nameList。println(rcvd。trim());  

之所以能这样编码,是因为Java 的exec()允许我们访问任何可执行模块,只要它能从标准输入中读,并能 

向标准输出中写。还有另一些方式可与非Java 代码“交谈”,这将在附录A 中讨论。  

从C 程序中捕获结果就显得稍微麻烦一些。我们必须调用 read(),并提供一个缓冲区,以便保存结果。 

read()的返回值是来自C 程序的字节数。若这个值为…1,意味着某个地方出现了问题。否则,我们就将 

resultBuf (结果缓冲区)转换成一个字串,然后同样清除多余的空格。随后,这个字串会象往常一样进入一 

个DatagramPacket,并传回当初发出请求的那个同样的地址。注意发送方的地址也是我们接收到的 

DatagramPacket 的一部分。  

记住尽管C 程序必须在 Web 服务器上编译,但 Java 程序的编译场所可以是任意的。这是由于不管使用的是什 

么硬件平台和操作系统,编译得到的字节码都是一样的。就就是Java 的“跨平台”兼容能力。  



15。5。2 NameSender 程序片  



正如早先指出的那样,程序片必须用Java 1。0 编写,使其能与绝大多数的浏览器适应。也正是由于这个原 

因,我们产生的类数量应尽可能地少。所以我们在这儿不考虑使用前面设计好的Dgram 类,而将数据报的所 

有维护工作都转到代码行中进行。此外,程序片要用一个线程监视由服务器传回的响应信息,而非实现 

Runnable 接口,用集成到程序片的一个独立线程来做这件事情。当然,这样做对代码的可读性不利,但却能 

产生一个单类(以及单个服务器请求)程序片:  

  

//: NameSender。java  

// An applet that sends an email address  

// as a datagram; using Java 1。02。  

import java。awt。*;  

import java。applet。*;  

import java。*;  

import java。io。*;  

  

public class NameSender extends Applet   

    implements Runnable {  

  private Thread pl = null;  



                                                                                    556 


…………………………………………………………Page 558……………………………………………………………

  private Button send = new Button(  

    〃Add email address to mailing list〃);  

  private TextField t = new TextField(  

    〃type your email address here〃; 40);  

  private String str = new String();  

  private Label   

    l = new Label(); l2 = new Label();  

  private DatagramSocket s;   

  private InetAddress hostAddress;  

  private byte'' buf =   

    new byte'NameCollector。BUFFER_SIZE';  

  private DatagramPacket dp =  

    new DatagramPacket(buf; buf。length);  

  private int vcount = 0;  

  public void init() {  

    setLayout(new BorderLayout());  

    Panel p = new Panel();  

    p。setLayout(new GridLayout(2; 1));  

    p。add(t);  

    p。add(send);  

    add(〃North〃; p);  

    Panel labels = new Panel();  

    labels。setLayout(new GridLayout(2; 1));  

    labels。add(l);  

    labe ls。add(l2);  

    add(〃Center〃; labels);  

    try {  

      // Auto…assign port number:  

      s = new DatagramSocket();  

      hostAddress = InetAddress。getByName(  

        getCodeBase()。getHost());  

    } catch(UnknownHostException e) {  

      l。setText(〃Cannot find host〃);  

    } catch(SocketException e) {  

      l。setText(〃Can't open socket〃);  

    }   

    l。setText(〃Ready to send your email address〃);  

  }  

  public boolean action (Event evt; Object arg) {  

    if(evt。target。equals(send)) {  

      if(pl != null) {  

        // pl。stop(); Deprecated in Java 1。2  

        Thread remove = pl;  

        pl = null;  

        remove。interrupt();  

      }  

      l2。setText(〃〃);  

      // Check for errors in email name:  

      str = t。getText()。toLowerCase()。trim();  

      if(str。indexOf(' ') != …1) {  

        l。setText(〃Spaces not allowed in name〃);  

        return true;  



                                                                                          557 


…………………………………………………………Page 559……………………………………………………………

      }  

      if(str。indexOf(';') != …1) {  

        l。setText(〃mas not allowed in name〃);  

        return true;  

      }  

      if(str。indexOf('@') == …1) {  

        l。setText(〃Name must include '@'〃);  

        l2。setText(〃〃);  

        return true;  

      }  

      if(str。indexOf('@') == 0) {  

        l。setText(〃Name must preceed '@'〃);  

        l2。setText(〃〃);  

        return true;  

      }  

      String end =   

        str。substring(str。indexOf('@'));  

      if(end。indexOf('。') == …1) {  

        l。setText(〃Portion after '@' must 〃 +  

          〃have an extension; such as '。'〃);  

        l2。setText(〃〃);  

        return true;  

      }  

      // Everything's OK; so send the name。 Get a  

      // fresh buffer; so it's zeroed。 For some   

      // reason you must use a fixed size rather  

      // than calculating the size dynamically:  

      byte'' sbuf =   

        new byte'NameCollector。BUFFER_SIZE';  

      str。getBytes(0; str。length(); sbuf; 0);  

      DatagramPacket toSend =  

        new DatagramPacket(  

          sbuf; 100; hostAddress;  

          NameCollector。COLLECTOR_PORT);  

      try {  

        s。send(toSend);  

      } catch(Exception e) {  

        l。setText(〃Couldn't send datagram〃);  

       
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!