当前位置:天才代写 > tutorial > JAVA 教程 > NameSender措施片

NameSender措施片

2017-11-13 08:00 星期一 所属: JAVA 教程 浏览:420

正如早先指出的那样,措施片必需用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.net.*;
import java.io.*;

public class NameSender extends Applet 
    implements Runnable {
  private Thread pl = null;
  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);
    labels.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;
      }
      if(str.indexOf(',') != -1) {
        l.setText("Commas 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 '.com'");
        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 come back from the server:
  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()要领的浸染是搜索个中的犯科字符。假如找到一个,就把环境陈诉给用户。留意举办所有这些事情时,都不必涉及网络通信,所以速度很是快,并且不会影响带宽和处事器的机能。
名字校验通过今后,它会打包到一个数据报里,然后回收与前面谁人数据报示例一样的方法发到主机地点和端口编号。第一个标签会产生变革,指出已乐成发送出去。并且按钮上的文字也会改变,酿成“重发”(resend)。这时会启动线程,第二个标签则会汇报我们措施片正在等待来自处事器的回应。
线程的run()要了解操作NameSender中包括的DatagramSocket来吸收数据(receive()),除非呈现来自处事器的数据报包,不然receive()会临时处于“堵塞”可能“暂停”状态。功效获得的数据包会放进NameSender的DatagramPacketdp中。数据会从包中提取出来,并置入NameSender的第二个标签。随后,线程的执行将间断,成为一个“死”线程。若某段时间里没有收到来自处事器的回应,用户大概变得不耐心,再次按下按钮。这样做会间断当前线程(数据发出今后,会再建一个新的)。由于用一个线程来监督回应数据,所以用户在监督期间仍然可以自由利用UI。

1. Web页
虽然,措施片必需放到一个Web页里。下面列出完整的Web页源码;稍微研究一下就可看出,我用它从本身创办的邮寄列表(Mailling List)里自动收集名字。
 

<HTML>
<HEAD>
<META CONTENT="text/html">
<TITLE>
Add Yourself to Bruce Eckel's Java Mailing List
</TITLE>
</HEAD>
<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#ffffff">
<FONT SIZE=6><P>
Add Yourself to Bruce Eckel's Java Mailing List
</P></FONT>
The applet on this page will automatically add your email address to the mailing list, so you will receive update information about changes to the online version of "Thinking in Java," notification when the book is in print, information about upcoming Java seminars, and notification about the “Hands-on Java Seminar” Multimedia CD. Type in your email address and press the button to automatically add yourself to this mailing list. <HR>
<applet code=NameSender width=400 height=100>
</applet>
<HR>
If after several tries, you do not get verification it means that the Java application on the server is having problems. In this case, you can add yourself to the list by sending email to 
<A HREF="mailto:Bruce@EckelObjects.com">
Bruce@EckelObjects.com</A>
</BODY>
</HTML>

措施片标志(<applet>)的利用很是简朴,和第13章展示的那一个并没有什么区别。

 

    关键字:

天才代写-代写联系方式