JAVA网页设计Java套接字编程(上)(3)
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)编程ServerSocket类因为SSClient利用了流套接字,以是服务程序也要利用流套接字。这就要创立一个ServerSocket对象,ServerSocket有几个机关函数,最复杂的是ServerSocket(intport),当利用ServerSocket(intport)创立一个ServerSocket对象,port参数传送端标语,这个端口就是服务器监听毗连哀求的端口,假如在这时候呈现毛病将抛出IOException非常对象,不然将创立ServerSocket对象并入手下手筹办吸收毗连哀求。
接上去服务程序进进无穷轮回当中,无穷轮回从挪用ServerSocket的accept()办法入手下手,在挪用入手下手后accept()办法将招致挪用线程堵塞直到毗连创建。在创建毗连后accept()前往一个比来创立的Socket对象,该Socket对象绑定了客户程序的IP地点或端标语。
因为存在单个服务程序与多个客户程序通信的大概,以是服务程序呼应客户程序不该该花良多工夫,不然客户程序在失掉服务前有大概花良多工夫来守候通信的创建,但是服务程序和客户程序的会话有多是很长的(这与德律风相似),因而为加速对客户程序毗连哀求的呼应,典范的办法是服务器主机运转一个背景线程,这个背景线程处置服务程序和客户程序的通信。
为了树模我们在下面谈到的慨念并完成SSClient程序,上面我们创立一个SSServer程序,程序将创立一个ServerSocket对象来监听端口10000的毗连哀求,假如乐成服务程序将守候毗连输出,入手下手一个线程处置毗连,并呼应来自客户程序的命令。上面就是这段程序的代码:
Listing3:SSServer.java
//SSServer.java
importjava.io.*;
importjava.net.*;
importjava.util.*;
classSSServer
{
publicstaticvoidmain(String[]args)throwsIOException
{
System.out.println("Serverstarting...
");
//Createaserversocketthatlistensforincomingconnection
//requestsonport10000.
ServerSocketserver=newServerSocket(10000);
while(true)
{
//Listenforincomingconnectionrequestsfromclient
//programs,establishaconnection,andreturnaSocket
//objectthatrepresentsthisconnection.
Sockets=server.accept();
System.out.println("AcceptingConnection...
");
//Startathreadtohandletheconnection.
newServerThread(s).start();
}
}
}
classServerThreadextendsThread
{
privateSockets;
ServerThread(Sockets)
{
this.s=s;
}
publicvoidrun()
{
BufferedReaderbr=null;
PrintWriterpw=null;
try
{
//Createaninputstreamreaderthatchainstothesockets
//byte-orientedinputstream.Theinputstreamreader
//convertsbytesreadfromthesockettocharacters.The
//conversionisbasedontheplatformsdefaultcharacter
//set.
InputStreamReaderisr;
isr=newInputStreamReader(s.getInputStream());
//Createabufferedreaderthatchainstotheinputstream
//reader.Thebufferedreadersuppliesaconvenientmethod
//forreadingentirelinesoftext.
br=newBufferedReader(isr);
//Createaprintwriterthatchainstothesocketsbyte-
//orientedoutputstream.Theprintwritercreatesan
//intermediateoutputstreamwriterthatconverts
//characterssenttothesockettobytes.Theconversion
//isbasedontheplatformsdefaultcharacterset.
pw=newPrintWriter(s.getOutputStream(),true);
//Createacalendarthatmakesitpossibletoobtaindate
//andtimeinformation.
Calendarc=Calendar.getInstance();
//Becausetheclientprogrammaysendmultiplecommands,a
//loopisrequired.Keeploopinguntiltheclienteither
//explicitlyrequeststerminationbysendingacommand
//beginningwithlettersBYEorimplicitlyrequests
//terminationbyclosingitsoutputstream.
do
{
//Obtaintheclientprogramsnextcommand.
Stringcmd=br.readLine();
//Exitifclientprogramhascloseditsoutputstream.
if(cmd==null)
break;
//Convertcommandtouppercase,foreaseofcomparison.
cmd=cmd.toUpperCase();
//IfclientprogramsendsBYEcommand,terminate.
if(cmd.startsWith("BYE"))
break;
//IfclientprogramsendsDATEorTIMEcommand,return
//currentdate/timetotheclientprogram.
if(cmd.startsWith("DATE")||cmd.startsWith("TIME"))
pw.println(c.getTime().toString());
//IfclientprogramsendsDOM(DayOfMonth)command,
//returncurrentdayofmonthtotheclientprogram.
if(cmd.startsWith("DOM"))
pw.println(""+c.get(Calendar.DAY_OF_MONTH));
//IfclientprogramsendsDOW(DayOfWeek)command,
//returncurrentweekday(asastring)totheclient
//program.
if(cmd.startsWith("DOW"))
switch(c.get(Calendar.DAY_OF_WEEK))
{
caseCalendar.SUNDAY:pw.println("SUNDAY");
break;
caseCalendar.MONDAY:pw.println("MONDAY");
break;
caseCalendar.TUESDAY:pw.println("TUESDAY");
break;
caseCalendar.WEDNESDAY:pw.println("WEDNESDAY");
break;
caseCalendar.THURSDAY:pw.println("THURSDAY");
break;
caseCalendar.FRIDAY:pw.println("FRIDAY");
break;
caseCalendar.SATURDAY:pw.println("SATURDAY");
}
//IfclientprogramsendsDOY(DayofYear)command,
//returncurrentdayofyeartotheclientprogram.
if(cmd.startsWith("DOY"))
pw.println(""+c.get(Calendar.DAY_OF_YEAR));
//IfclientprogramsendsPAUSEcommand,sleepforthree
//seconds.
if(cmd.startsWith("PAUSE"))
try
{
Thread.sleep(3000);
}
catch(InterruptedExceptione)
{
}
}
while(true);
{
catch(IOExceptione)
{
System.out.println(e.toString());
}
finally
{
System.out.println("ClosingConnection...
");
try
{
if(br!=null)
br.close();
if(pw!=null)
pw.close();
if(s!=null)
s.close();
}
catch(IOExceptione)
{
}
}
}
}
运转这段程序将失掉上面的输入:
Serverstarting...
AcceptingConnection...
ClosingConnection...
SSServer的源代码声了然一对类:SSServer和ServerThread;SSServer的main()办法创立了一个ServerSocket对象来监听端口10000上的毗连哀求,假如乐成,SSServer进进一个无穷轮回中,瓜代挪用ServerSocket的accept()办法来守候毗连哀求,同时启动背景线程处置毗连(accept()前往的哀求)。线程由ServerThread承继的start()办法入手下手,并实行ServerThread的run()办法中的代码。
一旦run()办法运转,线程将创立BufferedReader,PrintWriter和Calendar对象并进进一个轮回,这个轮回由读(经由过程BufferedReader的readLine())来自客户程序的一行文本入手下手,文本(命令)存储在cmd援用的string对象中,假如客户程序过早的封闭输入流,会产生甚么呢?谜底是:cmd将得不到赋值。
注重必需思索到这类情形:在服务程序正在读输出流时,客户程序封闭了输入流,假如没有对这类情形举行处置,那末程序将发生非常。
一旦编译了SSServer的源代码,经由过程输出JavaSSServer来运转程序,在入手下手运转SSServer后,就能够运转一个或多个SSClient程序。
首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。 Java 编程语言的风格十分接近C、C++语言。 是一种将安全性(Security)列为第一优先考虑的语言 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
页:
[1]