|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大.client|server|收集Java在Client/Server收集中的使用
( 2000年08月09日10:19)
跟着Java言语的日趋盛行,出格是Java与InternetWeb的亲切分离,使它在环球获得了伟大的乐成。Java言语以其自力于平台、面向对象、散布式、多线索及完美的平安机制等特征,成为古代信息体系建立中的优秀的开辟平台和运转情况。
1、Java收集使用模子
和Internet上的很多情况一样,完全的Java使用情况实践上也是一个客户机/服务器情况,更切实地说是扫瞄器/服务器模子(即Browser/Server模子,简称Web模子)。但与传统的客户机/服务器(C/S)的二层布局分歧,使用Java的Web模子是由三层布局构成的。传统的C/S布局经由过程动静传送机制,由客户端收回哀求给服务器,服务器举行响应处置后经传送机制送回客户端。而在Web模子中,服务器一端被分化成两部分:一部分是使用服务器(Web服务器),另外一部分是数据库服务器。
针对散布式盘算情况,Java经由过程其收集类库供应了优秀的撑持。对数据散布,Java供应了一个URL(UniformResourceLocator)对象,使用此对象可翻开并会见收集上的对象,其会见体例与会见当地文件体系几近完整不异。对操纵散布,Java的客户机/服务器形式能够把运算从服务器分离到客户一端(服务器卖力供应查询了局,客户机卖力构造了局的显现),从而进步全部体系的实行效力,增添静态可扩大性。Java收集类库是Java言语为顺应Internet情况而举行的扩大。别的,为顺应Internet的不休开展,Java还供应了静态扩大协定,以不休扩大Java收集类库。
Java的收集类库撑持多种Internet协定,包含Telnet,FTP和HTTP(WWW),与此绝对应的Java收集类库的子类库为:
Java.net
Java.net.ftp
Java.net.www.content
Java.net.www.html
Java.net.www.http
这些子类库各自包容了可用于处置Internet协定的类和办法。个中,java.net用于处置一些基础的收集功效,包含远程登录(Telnet);java.net.ftp用于处置ftp协定;java.net.www.content用于处置WWW页面内容;java.net.www.html和java.net.www.http则分离供应了对HTML言语和HTTP协定的撑持。
2、客户机/服务器情况下的Java使用程序
客户机/服务器在散布处置过程当中,利用基于毗连的收集通讯形式。该通讯形式起首在客户机和服务器之间界说一套通讯协定,并创立一Socket类,使用这个类创建一条牢靠的链接;然后,客户机/服务器再在这条链接上牢靠地传输数据。客户机收回哀求,服务器监听来自客户机的哀求,并为客户机供应呼应服务。这就是典范的"哀求--应对"形式。上面是客户机/服务器的一个典范运作历程:
1、服务器监听响应端口的输出;
2、客户机收回一个哀求;
3、服务器吸收到此哀求;
4、服务器处置这个哀求,并把了局前往给客户机;
5、反复上述历程,直至完成一次会话历程。
依照以上历程,我们利用Java言语编写一个分离针对服务器和客户机的使用程序(Application)。该程序在服务器上时,程序卖力监听客户机哀求,为每一个客户机哀求创建Socket毗连,从而为客户机供应服务。本程序供应的服务为:读取来自客户机的一行文本,反转该文本,并把它发还给客户机。
经由过程该程序实例我们看到,利用Java言语计划C/S程序时必要注重以下几点:
(1)、服务器应利用ServerSocket类来处置客户机的毗连哀求。当客户机毗连到服务器所监听的端口时,ServerSocket将分派一新的Socket对象。这个新的Socket对象将毗连到一些新端口,卖力处置与之绝对应客户机的通讯。然后,服务器持续监听ServerSocket,处置新的客户机毗连。
Socket和ServerSocket是Java收集类库供应的两个类。
(2)、服务器利用了多线程机制。Server对象自己就是一个线程,它的run()办法是一个无穷轮回,用以监听来自客户机的毗连。每当有一个新的客户机毗连时,ServerSocket就会创立一个新的Socket类实例,同时服务器也将创立一新线程,即一个Connection对象,以处置基于Socket的通讯。与客户机的一切通讯均由这个Connection对象处置。Connection的机关函数将初始化基于Socket对象的通讯流,并启动线程的运转。与客户机的通讯和服务的供应,均由Connection对象处置。
(3)、客户机起首创立一Socket对象,用以与服务器通讯。以后需创立两个对象:DataInputStream和PrintStream,前者用以从Socket的InputStream输出流中读取数据,后者则用于往Socket的OutputStream中写数据。最初,客户机程序从尺度输出(如:把持台)中读取数据,并把这些数据写到服务器,在从服务器读取应对动静,然后把这些应对动静写到准输入。
以下分离为服务器和客户机真个源程序清单。本程序在NT4.0收集情况(TCP/IP)下利用JDK1.1调试经由过程。
3、编写服务器类Java程序
//Server.java
importjava.io.*;
importjava.net.*;
publicclassServerextendsThread
{
publicfinalstaticintDefault_Port=6543;
protectdintport;
protectdServerSocktlisten_socket;
//界说堕落例程:假如呈现非常毛病,加入程序。
Publicstaticvoidfail(Exceptione,Stringmsg)
{
System.err.println(msg+":"+e);
System.exit(1);
}
//界说并启动服务器的Socket例程,监听客户机的毗连哀求。
publicServer(intport)
{
if(port==0)port=Default_Port;
this.port=port;
try
{
listen_socket=newServerSocket(port);
}
catch(IOExceptione)fail(e,"Exceptioncreatingserversocket");
System.out.println("Server:listeningonport"+port);
This.start();
}
/*上面为服务器监听线程的主程序。该线程一向轮回实行,监听并承受客户机收回的毗连
哀求。对每个毗连,均发生一个毗连对象与之对应,经由过程Socket通道举行通讯。*/
publicvoidrun()
{
try
{
while(true)
{
Socketclient_socket=listen_socket.accept();
Connectionc=newConnection(client_socket);
}
}
catch(IOExceptione)fail(e,"Exceptionwhilelisteningforconnections")
}
//启动服务器主程序
publicstaticvoidmain(Stringargs[])
{
intport=0;
if(args.length==1)
{
tryport=Integer.parseInt(args[0]);
catch(NumberFormatExceptione)port=0;
}
newServer(port);
} //Endofthemain
} //EndofServerclass
//以下界说了Connection类,它是用来处置与客户机的一切通讯的线程。
classConnectionextendsThread
{
protectedSocketclient;
protectedDataInputStreamin;
protectedPrintStreamout;
//初始化通讯流并启动线程
publicConnection(Socketclient_socket)
{
client=client_socket;
try
{
in=newDataInputStream(client.getinputStream());
out=newPrintStream(client.getOutputStream());
}
catch(IOExceptione)
{
tryclient.close();
catch(IOExceptione2);
System.err.println("Exceptionwhilegettingsocketstreram:"+e);
Return;
}
this.start;
} //EndofConnectionmethod
//服务例程:读出一行文本;反转文本;前往文本。
publicvoidrun()
{
Stringline;
StringBufferrevline;
intlen;
try
{
for(;;)
{
//Readaline
line=in.readline();
if(line==null)break;
//Reversetheline
len=line.length();
revline=newStringBuffer(len);
for(inti=len-1;i>=0;i--)
revline.insert(len-1-I;line.charAt(i));
//Writeoutthereverseline
out.println(revline);
}
catch(IOExceptione);
finallytryclient.close();
catch(IOExceptione2);
}
//Endofrunmethod
}
//EndofConnectionclass
3、编写客户机类Java程序
//Client.java
importjava.io.*;
importjava.net.*;
publicclassClientextends
{
publicstaticfinalintDefault_Port=6543;
//界说堕落例程
publicstaticfinalvoidusage()
{
System.out.println("Usage:JavaClient[]");
System.exit(0);
}
publicstaticvoidmain(Stringargs[])
{
intport=Default_Port;
Sockets=null;
//剖析端口参数
if((args.length!=1)&&(args.length!=2))usage();
if(args.length==1)
port=Default_Port;
else
{
tryport=Integer.parseInt(args[1]);
catch(NumberFormaatExceptione)usage();
}
try{
//发生一个Socket,经由过程指定的端口与主机通讯。
s=newSocket(args[0],port);
//发生用于收回和吸收的文本字符流
DataInputStreamsin=newDataInputStream(s.getInputStream());
PrintStreamsout=newDataInputStream(s.getInputStream());
//从把持台读进字符流
DataInputStreamin=newDataInputStream(System.in);
//前往毗连的地点和端口
System.out.println("Connectedto"+s.getInetAddress()+":"+s.getPort());
Stringline;
For(;;)
{
//显现提醒符
System.out.print(">");
System.out.flush();
//读进把持台输出的一行字符
line=in.readline();
if(line==null)break;
//将吸收的文本行送至服务器
sout.println(line);
//从服务器吸收一行字符
line=sin.readline();
//Checkifconnectionisclosed(i.e.forEOF)
if(line==null)
{
System.out.println("Connectionclosedbyserver.");
Break;
}
//在把持台上显现吸收的字符
System.out.println(line);
}
//Endofforloop
}
/Endoftry
catch(IOExceptione)System.err.println(e);
//Alwaysbesuretoclosethesocket
finally
{
tryif(s!=null)s.close();
catch(IOExceptione2);
}
} //Endofmain
} //EndofClient
运转该客户机程序时,必需以服务器主机名作为第一个参数,服务器端标语为第二个参数,
个中服务器端标语可缺省。
在性能方面,在windows平台下,.net可能是占强项,要是把.net放在sun开发的操作系统上去运行呢?根本就运行不了,.net对其它操作系统的支持也很弱,性能也可能比不上java。 |
|