|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
什么时候上述的三种开发工具能和三为一,什么时候java的竞争力才更强,才有机会拉拢更多的程序员投入到对java的开发上,因为到时的开发工具将会比.net网页编程的更简单。还有一点也很关键,什么时候java推出的jsf能成为真正意义上的标准。
正如新近指出的那样,程序片必需用Java1.0编写,使其能与尽年夜多半的扫瞄器顺应。也恰是因为这个缘故原由,我们发生的类数目应尽量地少。以是我们在这儿不思索利用后面计划好的Dgram类,而将数据报的一切保护事情都转到代码行中举行。别的,程序片要用一个线程监督由服务器传回的呼应信息,而非完成Runnable接口,用集成到程序片的一个自力线程来做这件事变。固然,如许做对代码的可读性倒霉,但却能发生一个单类(和单个服务器哀求)程序片:
- //:NameSender.java
- //Anappletthatsendsanemailaddress
- //asadatagram,usingJava1.02.
- importjava.awt.*;
- importjava.applet.*;
- importjava.net.*;
- importjava.io.*;
- publicclassNameSenderextendsApplet
- implementsRunnable{
- privateThreadpl=null;
- privateButtonsend=newButton(
- "Addemailaddresstomailinglist");
- privateTextFieldt=newTextField(
- "typeyouremailaddresshere",40);
- privateStringstr=newString();
- privateLabel
- l=newLabel(),l2=newLabel();
- privateDatagramSockets;
- privateInetAddresshostAddress;
- privatebyte[]buf=
- newbyte[NameCollector.BUFFER_SIZE];
- privateDatagramPacketdp=
- newDatagramPacket(buf,buf.length);
- privateintvcount=0;
- publicvoidinit(){
- setLayout(newBorderLayout());
- Panelp=newPanel();
- p.setLayout(newGridLayout(2,1));
- p.add(t);
- p.add(send);
- add("North",p);
- Panellabels=newPanel();
- labels.setLayout(newGridLayout(2,1));
- labels.add(l);
- labels.add(l2);
- add("Center",labels);
- try{
- //Auto-assignportnumber:
- s=newDatagramSocket();
- hostAddress=InetAddress.getByName(
- getCodeBase().getHost());
- }catch(UnknownHostExceptione){
- l.setText("Cannotfindhost");
- }catch(SocketExceptione){
- l.setText("Cantopensocket");
- }
- l.setText("Readytosendyouremailaddress");
- }
- publicbooleanaction(Eventevt,Objectarg){
- if(evt.target.equals(send)){
- if(pl!=null){
- //pl.stop();DeprecatedinJava1.2
- Threadremove=pl;
- pl=null;
- remove.interrupt();
- }
- l2.setText("");
- //Checkforerrorsinemailname:
- str=t.getText().toLowerCase().trim();
- if(str.indexOf()!=-1){
- l.setText("Spacesnotallowedinname");
- returntrue;
- }
- if(str.indexOf(,)!=-1){
- l.setText("Commasnotallowedinname");
- returntrue;
- }
- if(str.indexOf(@)==-1){
- l.setText("Namemustinclude@");
- l2.setText("");
- returntrue;
- }
- if(str.indexOf(@)==0){
- l.setText("Namemustpreceed@");
- l2.setText("");
- returntrue;
- }
- Stringend=
- str.substring(str.indexOf(@));
- if(end.indexOf(.)==-1){
- l.setText("Portionafter@must"+
- "haveanextension,suchas.com");
- l2.setText("");
- returntrue;
- }
- //EverythingsOK,sosendthename.Geta
- //freshbuffer,soitszeroed.Forsome
- //reasonyoumustuseafixedsizerather
- //thancalculatingthesizedynamically:
- byte[]sbuf=
- newbyte[NameCollector.BUFFER_SIZE];
- str.getBytes(0,str.length(),sbuf,0);
- DatagramPackettoSend=
- newDatagramPacket(
- sbuf,100,hostAddress,
- NameCollector.COLLECTOR_PORT);
- try{
- s.send(toSend);
- }catch(Exceptione){
- l.setText("Couldntsenddatagram");
- returntrue;
- }
- l.setText("Sent:"+str);
- send.setLabel("Re-send");
- pl=newThread(this);
- pl.start();
- l2.setText(
- "Waitingforverification"+++vcount);
- }
- elsereturnsuper.action(evt,arg);
- returntrue;
- }
- //Thethreadportionoftheappletwatchesfor
- //thereplytocomebackfromtheserver:
- publicvoidrun(){
- try{
- s.receive(dp);
- }catch(Exceptione){
- l2.setText("Couldntreceivedatagram");
- return;
- }
- l2.setText(newString(dp.getData(),
- 0,0,dp.getLength()));
- }
- }///:~
复制代码
程序片的UI(用户界面)十分复杂。它包括了一个TestField(文本字段),以便我们键进一个电子信件地点;和一个Button(按钮),用于将地点发给服务器。两个Label(标签)用于向用户呈报形态信息。
到如今为止,人人已能判别出DatagramSocket、InetAddress、缓冲区和DatagramPacket都属于收集毗连中对照贫苦的部分。最初,人人可看到run()办法完成了线程部分,使程序片可以“侦听”由服务器传回的呼应信息。
init()办法用人人熟习的结构工具设置GUI,然后创立DatagramSocket,它将同时用于数据报的收发。
action()办法只卖力监督我们是不是按下了“发送”(send)按钮。记着,我们已被限定在Java1.0下面,以是不克不及再用较天真的外部类了。按钮按下今后,接纳的第一项举动即是反省线程pl,看看它是不是为null(空)。假如不为null,标明有一个举动线程正在运转。动静初次收回时,会启动一个新线程,用它监督来自服务器的回应。以是倘使有个线程正在运转,就意味着这并不是用户第一次发送动静。pl句柄被设为null,同时中断本来的监督者(这是最公道的一种做法,由于stop()已被Java1.2“否决”,这在前一章已注释过了)。
不管这是不是按钮被第一次按下,I2中的笔墨城市扫除。
下一组语句将反省E-mail名字是不是及格。String.indexOf()办法的感化是搜刮个中的不法字符。假如找到一个,就把情形呈报给用户。注重举行一切这些事情时,都不用触及收集通讯,以是速率十分快,并且不会影响带宽和服务器的功能。
名字校验经由过程今后,它会打包到一个数据报里,然后接纳与后面谁人数据报示例一样的体例发到主机地点和端口编号。第一个标签会产生变更,指出已乐成发送进来。并且按钮上的笔墨也会改动,酿成“重发”(resend)。这时候会启动线程,第二个标签则会告知我们程序片正在期待来自服务器的回应。
线程的run()办法会使用NameSender中包括的DatagramSocket来吸收数据(receive()),除非呈现来自服务器的数据报包,不然receive()会临时处于“梗塞”大概“停息”形态。了局失掉的数据包会放进NameSender的DatagramPacketdp中。数据会从包中提掏出来,并置进NameSender的第二个标签。随后,线程的实行将中止,成为一个“逝世”线程。若某段工夫里没有收到来自服务器的回应,用户大概变得不耐心,再次按下按钮。如许做会中止以后线程(数据收回今后,会再建一个新的)。因为用一个线程来监督回应数据,以是用户在监督时代仍旧能够自在利用UI。
1.Web页
固然,程序片必需放到一个Web页里。上面列出完全的Web页源码;略微研讨一下便可看出,我用它从本人创办的邮寄列表(MaillingList)里主动搜集名字。- <HTML>
- <HEAD>
- <METACONTENT="text/html">
- <TITLE>
- AddYourselftoBruceEckelsJavaMailingList
- </TITLE>
- </HEAD>
- <BODYLINK="#0000ff"VLINK="#800080"BGCOLOR="#ffffff">
- <FONTSIZE=6><P>
- AddYourselftoBruceEckelsJavaMailingList
- </P></FONT>
- Theappletonthispagewillautomaticallyaddyouremailaddresstothemailinglist,soyouwillreceiveupdateinformationaboutchangestotheonlineversionof"ThinkinginJava,"notificationwhenthebookisinprint,informationaboutupcomingJavaseminars,andnotificationaboutthe“Hands-onJavaSeminar”MultimediaCD.Typeinyouremailaddressandpressthebuttontoautomaticallyaddyourselftothismailinglist.<HR>
- <appletcode=NameSenderwidth=400height=100>
- </applet>
- <HR>
- Ifafterseveraltries,youdonotgetverificationitmeansthattheJavaapplicationontheserverishavingproblems.Inthiscase,youcanaddyourselftothelistbysendingemailto
- <AHREF="mailto:Bruce@EckelObjects.com">
- Bruce@EckelObjects.com</A>
- </BODY>
- </HTML>
复制代码
程序片标志(<applet>)的利用十分复杂,和第13章展现的那一个并没有甚么区分。
那这个对象有什么意义?现在很多用javabean的人就不能保证对象有完整的意义,不成熟的使用模式等导致代码疯狂增长,调试维护的时间要得多得多。在说性能之前,先说说你这个比较的来历。据说微软为了证明。net网页编程比java好。 |
|