副标题#e#
摘要 本文叙述了利用JAVA编程语言对基于客户/处事器模式的应用编写网络通信措施,接头了SOCKET机制、输入输出流以及措施实现代码。
要害词 JAVA,网络,SOCKET,APPLET
网络上的系统布局多为客户/处事器模式,处事器端认真数据和图像等的存储、维护、打点以及通报,客户端则认真人机界面的操纵、送出需求及显示收回的数据。
下面先容一下如何利用JAVA来举办网络编程:
1) 由于客户端通过IE同处事器成立接洽,所以客户端利用Applet,处事器端利用Application;
2) 处事器应配置成多线程,应答多个客户的请求;
3) 两头通信利用SOCKET机制。
Java中输入/输出流观念:
过滤流DataInputStream 和DataOutputStream 除了别离作为FilterInputStream 和FilterOutputStream的子类外,还别离实现了接口DataInput 和DataOutput。接口DataInput 中界说的要领主要包罗从流中读取根基范例的数据、读取一行数据、可能读取指定长度的字节数,如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中界说的要领主要是向流中写入根基范例的数据可能写入必然长度的字节数组,如writeChar()、writeDouble() DataInputStream可以从所毗连的输入流中读取与呆板无关的根基范例数据,用以实现一种独立于详细平台的输入方法;DataInputStream 可以向所毗连的输出流写入根基范例的数据。
Socket 机制
Socket是面向客户/处事器模子设计的,网络上的两个措施通过一个双向的通讯毗连实现数据的互换,这个双向链路的一端称为一个Socket。 Socket凡是用来实现客户方和处事方的毗连。客户措施可以向Socket写请求,处事器将处理惩罚此请求,然后通过Socket将功效返回给用户。
Socket通信机制提供了两种通讯方法:有联接和无联接方法,别离面向差异的应用需求。利用有联接方法时,通信链路提供了靠得住的,全双工的字节约处事。在该方法下,通信两边必需建设一个联接进程并成立一条通讯链路,今后的网络通信操纵完全在这一对历程之间举办,通信完毕封锁此联接进程。利用无联接方法时其系统开销比无联接方法小,但通信链路提供了不行靠的数据报处事,不能担保信源所传输的数据必然可以或许达到信宿。在该方法下,通信两边不必建设一个联接进程和成立一条通讯链路,网络通信操纵在差异的主机和历程之间转发举办。
#p#副标题#e#
Java语言简介
Java语言的利益主要表示在:简朴、面向工具、多线程、漫衍性、体系布局中立、安详性等方面。
(1) 简朴性
Java与C++语言很是临近,但Java比C++简朴,它丢弃了C++中的一些不是绝对须要的成果,如头文件、预处理惩罚文件、指针、布局、运算符重载、多重担任以及自动强迫同型。Java实现了自动的垃圾收集,简化了内存打点的事情。这使措施设计越发轻便,同时淘汰了堕落的大概。
(2) 面向工具
Java提供了简朴的类机制和动态的构架模子。工具中封装了它的状态变量和要领,很好地实现了模块化和信息埋没;而类则提供了一类工具的原型,通过担任和重载机制,子类可以利用或从头界说父类或超类所提供的要领,从而既实现了代码的复用,又提供了一种动态的办理方案。
Java是一种完全面向工具的措施设计语言,它除了数组、布尔和字符三个根基数据范破例的其它类都是工具,它不再支持全局变量。在Java中,假如不建设新类就无法建设措施,Java措施在运行时必需先建设一个类的实例,然后才气提交运行。
Java同样支持担任特性,Java的类可以从其它类中担任行为,但Java只支持类的单重担任,即每个类只能从一个类中担任。
Java支持界面,界面答允措施员界说要领但又不当即实现,一个类可以实现多个界面,操作界面可以获得多重担任的很多利益而又没有多重担任的问题。
(3) 多线程
多线程使应用措施可以同时举办差异的操纵,处理惩罚差异的事件。在多线程机制中,差异的线程处理惩罚差异的任务,他们之间互不过问干与,不会由于一处期待影响其他部门,这样容易实现网络上的及时交互操纵。
Java措施可以有多个执行线程,如可以让一个线程举办巨大的计较,而让另一个线程与用户举办交互,这样用户可以在不间断计较线程的前提下与系统举办交互。多线程担保了较高的执行效率。
(4) 漫衍性
Java是面向网络的语言。通过它提供的类库可以处理惩罚TCP/IP协议,用户可以通过URL地点在网络上很利便的会见其他工具。
(5) 体系布局中立
#p#分页标题#e#
Java是一种网络语言,为使Java措施能在网络的任那里所运行,Java表明器生成与体系布局无关的字节码布局的文件名目。Java为了做到布局中立,除生成呆板无关的字节码外,还拟定了完全统一的语言文本,如Java的根基数据范例不会随方针机的变革而变革,一个整型老是32位,一个长整型老是64位。
为了使Java的应用措施能不依赖于详细的系统,Java语言情况还提供了用于会见底层操纵系统成果的类构成的包,当措施利用这些包时,可以确保它能运行在各类支持Java的平台上。
java.lang: 一般的语言包。个中包罗用于字符串处理惩罚、多线程、异常处理惩罚和数字函数等的类,该包是实现Java措施运行平台的根基包
java.util: 实用东西包。个中包罗哈希表、仓库、时间和日期等
java.io: 基于流模子的输入/输出包。该包用统一的流模子实现了各类名目标输入/输出,包罗文件系统、网络和设备的输入/输出等
java.net: 网络包。该包支持TCP/IP协议,个中提供了socket、URL和WWW的编程接口
java.awt: 抽象窗口东西集。个中实现了可以跨平台的图形用户界面组件,包罗窗口、菜单、转动条和对话框等
java.applet: 支持applet措施设计的根基包
(6) 安详性
用于网络、漫衍情况下的Java必需要防备病毒的入侵,Java不支持指针,一切对内存的会见都必需通过工具的实例变量来实现,这样就防备了措施员利用欺骗手段会见工具的私有成员,同时也制止了指针操纵中容易发生的错误。
JAVA东西
(1) JDK
1) Java编译器
Java编译器将Java源代码文件编译成可执行的Java字节码。Java源代码文件的扩展名为 .java,Java编译器把这种扩展名的文件编译成扩展名为.class的文件。源文件中的每个类在编译后都将发生一个class文件,这意味一个Java源代码文件大概编译生成多个class文件。
2) Java表明器
Java表明器对编译生成的字节码名目标可执行措施的运行提供支持,它是运行非图形Java措施的呼吁行东西。
3) Appletviewer
它是Java Applet的简朴测试东西,可利用它来测试Java Applet措施,而不需要WWW欣赏器的支持。
(2) Visual J++
Visual J++ 集成了可视化界面设计、交互式调试、代码编辑、联机辅佐信息和先容如何快速把握该开拓情况的实用领导等多项成果,同时具有能充实操作Active X和COM新技能的优势。操作Visual J++可建设交互性很强的Internet应用措施,是可贵的Java 开拓系统。
客户机/处事器通信的实现:
(1) Application 同 Applet 的通信
两头通过Socket机制举办毗连:
1) 客户端的编程流程:
i、打开Socket,新建一个套接字;
ii、为套接字成立一个输入和输出流;
iii、按照处事器协议从套接字读入或向套接字写入;
iiii、排除套接字和输入/输出流;
2)处事器端的编程流程:
打开Server Socket,建设一个处事器型套接字和一个普通套接字,处事器型套接字在指定端口为客户端请求的Socket 处事;
i、利用ServerSocket类的accept()要领使处事器型套接字处于监听状态并把监听功效返回给普通套接字;
ii、为该普通套接字建设输入和输出流;
iii、从输入和输出流中读入或写入字节约,举办相应的处理惩罚,并将功效返回给客户端;
iiii、在客户端和处事器事情竣事后封锁所有的工具,如处事器型的套接字,普通套接字,输入和输出流。
正是由于Java系统具有基于Socket的机动通信机制,因而其应用措施能自由地打开和会见网络上的工具,就象在当地文件系统中一样。
(2) Applet之间的通信:
Applet之间的通信利用Applet Context类的getApplet()要领。
<applet code=applet1.class width=200 height=200 name=first>
只要在措施中插手
Applet oneapplet=getAppletContext().getApplet("first");便可利用name为first的Applet中的要领了。
在该课题中大量利用了该种通信要领,因为专门同处事器端通信的 Applet中包括吸收信息要领和发送信息要领,所有客户端的Applet都要利用认真通信的Applet中的要领,所以客户端的Applet同认真通信的Applet必需举办通信。
措施
//处事器端措施S.java 认真与客户端通信
import java.io.*;
import java.net.*;
import java.lang.*;
import T2;
class ThreadEchoHandler extends Thread //建设线程
{
T2 theT2=new T2();
Socket incoming;
int counter;
ThreadEchoHandler(Socket i,int c)
{
incoming=i;
counter=c;
}
public void run()
{
try
{
DataInputStream in=new DataInputStream(incoming.getInputStream());
DataOutputStream out=new DataOutputStream(incoming.getOutputStream());
System.out.println ("hello");
boolean done=false;
while(!done)
{
String aa="";
String str=in.readUTF(); //从客户端获得字符串
//在此插手各自的处事措施
System.out.println (str);
theT2.pass(str); //解码
theT2.tongji(); //修改监控库中的信息
aa=theT2.guan(); //哄骗数据库
System.out.println ("string z is:"+aa);
if(aa.compareTo("null")!=0 )
//若是查询数据库,返回查询后的功效
{
//若不是查询数据库,不向客户端输出信息
out.writeUTF(aa);
out.flush();
}
}//while
incoming.close(); //线程封锁
}//try
catch(IOException e)
{System.out.println(e);}
}//end run
}
//----------------------------------------
class S
{
public static void main(String[] args)
{
int i=1;
try
{
ServerSocket s=new ServerSocket(1111);
for(;;)
{
Socket incoming=s.accept();
System.out.println("connect: "+i);
new ThreadEchoHandler(incoming,i).start();
i++;
}
}
catch(Exception e)
{ System.out.println(e); }
}
}
//客户端通信小应用措施 Echo.java
import java.io.*;
import java.net.*;
import java.awt.*;
import java.applet.*;
public class Echo extends Applet
{
TextArea ta;
Socket echoSocket;
DataOutputStream os;
DataInputStream is;
String Line;
public void init()
{
setBackground(Color.white);
ta=new TextArea(5,80);
ta.setEditable(false);
add(ta);
try
{
echoSocket=new Socket("10.102.4.41",1111);} //与处事器成立毗连
catch(IOException e)
{System.out.println("error");}
}
public void st(String stri) //发送字符串的要领
{
try
{
DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());
DataInputStream is=new DataInputStream(echoSocket.getInputStream());
os.writeUTF(""+ stri ); //向处事器输送string
os.flush();
}
catch(IOException e)
{System.out.println(" error:"+e); }
}
public String st1() //吸收字符串的要领
{
String Line="";
try
{
DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());
DataInputStream is=new DataInputStream(echoSocket.getInputStream());
Line=is.readUTF(); //从处事器读来的信息
ta.appendText(""+Line); //在文本域中输出信息
}
catch(IOException e)
{
System.out.println(" error:"+e);
}
return Line;
}
}
措施调试心得:
1) 在成立Socket毗连时,两头的端标语必需设为一致,不然成立不了毗连。处事器端必需有主机IP地点或主机名参数。
#p#分页标题#e#
2) 毗连成立好之后应确定输入和输出流。起劈头伐顶用的是DataInputStream和PrintStream,功效只能传输英文,传输中文时发生乱码,将PrintStream改为DataOutputStream,利用readUTF()和writeUTF()要领后,中文传输问题获得办理。
3) 假如一个利用某端口的措施没有封锁,另一个措施就不能利用这个端口。
4) 开始举办通信的措施均为 Application,因不切合客户机/处事器机制,应将客户端的Application改为Applet。其转化的主要步调如下:
i、建设一个包括APPLET标签的HTML文件;
ii、去掉应用措施中的main()要领;
iii、类名应担任Applet类,而不是Frame类,并在措施开头插手
import java.applet.*;语句;
iiii、 用init()要领取代Application措施中的结构要领,当欣赏器建设Applet类工具的时候,它自动执行init()要领;
iiiii、 如Application中缺省利用了BorderLayout机关打点器,应在Applet的init()要领中从头设定;
iiiiii、假如Application中有setTitle()要领,必需将其去掉,如Application中利用了菜单,在Applet 顶用按钮来替换。
5) 分明白在一措施中如何引用自界说的类中的要领和变量,在措施开头插手import 类名;在措施中插手 类名 实例=new 类名(); 然后利用
实例.要领(),实例.变量即可。
参考文献:
[1] 廖雷等,Java措施设计教程,中国电力出书社,2003 [2] Warton,Java多线程编程劈头,电脑报,2004.4.10 [3] 张立等,基于Client/Server模式的数据库应用软件的设计与实现,计较机应用研究,1999(4)