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

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

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




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

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〃);  

        return true;  

      }  

      l。setText(〃Sent: 〃 + str);  

      send。setLabel(〃Re…send〃);  

      pl = new Thread(this);  

      pl。start();  

      l2。setText(  

        〃Waiting for verification 〃 + ++vcount);  

    }  

    else return super。action(evt; arg);  

    return true;  

  }  

  // The thread portion of the applet watches for  

  // the reply to e back from the server:  



                                                                                        558 


…………………………………………………………Page 560……………………………………………………………

  public void run() {  

    try {  

      s。receive(dp);  

    } catch(Exception e) {  

      l2。setText(〃Couldn't receive datagram〃);  

      return;  

    }  

    l2。setText(new String(dp。getData();  

      0; 0; dp。getLength()));  

  }  

} ///:~  

  

程序片的UI (用户界面)非常简单。它包含了一个TestField (文本字段),以便我们键入一个电子函件地 

址;以及一个Button (按钮),用于将地址发给服务器。两个Label (标签)用于向用户报告状态信息。  

到现在为止,大家已能判断出DatagramSocket、InetAddress、缓冲区以及DatagramPacket 都属于网络连接 

中比较麻烦的部分。最后,大家可看到run()方法实现了线程部分,使程序片能够“侦听”由服务器传回的 

响应信息。  

init()方法用大家熟悉的布局工具设置 GUI,然后创建 DatagramSocket,它将同时用于数据报的收发。  

action()方法只负责监视我们是否按下了“发送”(send)按钮。记住,我们已被限制在Java 1。0 上面,所 

以不能再用较灵活的内部类了。按钮按下以后,采取的第一项行动便是检查线程pl,看看它是否为null 

 (空)。如果不为null ,表明有一个活动线程正在运行。消息首次发出时,会启动一个新线程,用它监视来 

自服务器的回应。所以假若有个线程正在运行,就意味着这并非用户第一次发送消息。pl 句柄被设为 null, 

同时中止原来的监视者(这是最合理的一种做法,因为stop()已被Java 1。2 “反对”,这在前一章已解释过 

了)。  

无论这是否按钮被第一次按下,I2 中的文字都会清除。  

下一组语句将检查E…mail 名字是否合格。String。indexOf()方法的作用是搜索其中的非法字符。如果找到一 

个,就把情况报告给用户。注意进行所有这些工作时,都不必涉及网络通信,所
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!