日期:2011-03-22 16:16:00 来源:本站整理
NameSender程序片[Java编程]
本文“NameSender程序片[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
正如早先指出的那样,程序片必须用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)里自动汇集名字.
程序片标志(<applet>)的利用非常简单,和第13章展示的那一个并没有什么辨别.<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>
以上是“NameSender程序片[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:服务器和客户机
- ·下一篇文章:<b>java服务器操纵</b>
- ·中查找“NameSender程序片”更多相关内容
- ·中查找“NameSender程序片”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论