📄 jv0503.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0041)http://king.online.ha.cn/java/jc/Jyu5.htm -->
<HTML><HEAD><TITLE>第五章 输入、界面和网络</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="MSHTML 5.00.2614.3500" name=GENERATOR><LINK
href="java04.css" rel=stylesheet type=text/css>
<SCRIPT language=JavaScript>
<!-- Hide the script from old browsers --
// Michael P. Scholtis (mpscho@planetx.bloomu.edu)
// All rights reserved. January 15, 1996
// You may use this JavaScript example as you see fit, as long as the
// information within this comment above is included in your script.
function MakeArray(n){
this.length=n;
for(var i=1; i<=n; i++) this[i]=i-1;
return this
}
hex=new MakeArray(16);
hex[11]="A"; hex[12]="B"; hex[13]="C"; hex[14]="D"; hex[15]="E"; hex[16]="F";
function ToHex(x){ // Changes a int to hex (in the range 0 to 255)
var high=x/16;
var s=high+""; //1
s=s.substring(0,2); //2 the combination of these are the same as the trunc function
high=parseInt(s,10); //3
var left=hex[high+1]; // left part of the hex-value
var low=x-high*16; // calculate the rest of the values
s=low+""; //1
s=s.substring(0,2); //2 the combination of these are the same as the trunc function
low=parseInt(s,10); //3
var right=hex[low+1]; // right part of the hex-value
var string=left+""+right; // add the high and low together
return string;
}
function rainbow(text){
text=text.substring(3,text.length-4); // gets rid of the HTML-comment-tags
color_d1=255; // any value in 'begin' 0 to 255
mul=color_d1/text.length;
for(i=0;i<text.length;i++){
color_d1=255*Math.sin(i/(text.length/3)); // some other things you can try>> "=255-mul*i" to fade out, "=mul*i" to fade in, or try "255癕ath.sin(i/(text.length/3))"
color_h1=ToHex(color_d1);
color_d2=mul*i;
color_h2=ToHex(color_d2);
document.write("<FONT COLOR='#FF"+color_h1+color_h2+"'>"+text.substring(i,i+1)+'</FONT>');
}
}
// --End Hiding Here -->
</SCRIPT>
<SCRIPT LANUGAGE="JavaScript">
<!--
function pop(pageurl) {
var
popwin=window.open(pageurl,"popWin","scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,resizable=no,width=700,height=450");
return false;
}
//-->
</SCRIPT>
<STYLE type=text/css>.main {
FONT-FAMILY: "宋体"; FONT-SIZE: 9pt
}
</STYLE>
<SCRIPT language=LiveScript>
function WinOpen() {
msg=open("","DisplayWindow","toolbar=no,directories=no,menubar=no");
msg.document.write("");
msg.document.write("<CENTER><H1>酷毙了</H1><h2>这 是<B>JavaScript</B>所开的视窗!</h2></CENTER>");
}
</SCRIPT>
</HEAD>
<BODY background=bk.jpeg bgColor=#ffffff leftMargin=0 text=#000000 topMargin=0 marginwidth="0" marginheight="0" tracingopacity="35" tracingsrc="file:///D|/tiu.jpg">
<p> </p>
<H3>第五章 输入、界面和网络</H3>
<p> <a name="53"></a>5.3 网络编程</p>
<p> 设计人机界面的目的是帮助用户与远端的服务器进行交互式对话,但在大多数情况下,实现这种对话需要Applet对服务器上的文件进行访问,或与服务器交换信息,所以要实现这种对话就离不开网络的支持。在Java中,也有网络编程。但是,出于安全性的考虑,Java中对Applet的访问权限有严格的控制。如果一台工作站运行另一台服务器上的Applet,那么这个Applet不经允许不能访问工作站上的文件,除了那台服务器,Applet也不能访问其它机器上的文件,也就是说,在Applet中只能访问服务器中的文件。而在Application中就没有这样的限制。实际上,Java本身的用途是一种网络计算语言,编写Applet只是Java用途中的一种,真正复杂的Java程序是进行网络通信的Application。<br>
Java中的网络编程,我们分成网络资源的使用、Socket类和数据报三个部分来介绍。</p>
<p> <a name="531"></a>5.3.1 网络资源的使用</p>
<p> 关于网络资源的编程主要有两方面,一个是在Applet中建立于其它URL的连接,另一个是对服务器上的文件进行操作。这两个方面需要使用几个重要的类AppletContext类、URL类和URLconnection类<br>
1. URL类<br>
在Internet上的所有网络资源都是用URL(Uniform Resource Locator)来表示的,URL类在Applet的网络编程中也是相对重要的,网络编程都以它为基础,其它两个类也要使用URL类。URL类的构造方法有四种。<br>
URL(String, String, int, String)构造一个URL类。第一个String类型的参数是协议的类型,可以是http,ftp,file等。第二个String类型参数是主机名,int类型参数是指定端口号,最后一个参数是给出文件名或路径名。<br>
URL(String, String, String)构造一个URL类。参数含义与上相同,使用缺省端口号。<br>
URL(URL, String)构造一个URL类。使用给出的URL和相对路径,String类型参数是相对路径。<br>
URL(String)使用URL字符串构造一个URL类。与以往介绍的其它类不同的是,在构造URL类时,必须有相应的异常处理(有关异常处理在后面的第七章中将详细介绍)。因此应写成:<br>
String ECNU = *http://www.ecnu.edu.cn/*;<br>
try { url = new URL(ECNU); }<br>
catch (MalformedURLException e) {<br>
…… //出错处理<br>
}<br>
在构造完一个URL类后,可以使用URL类中的openStream方法与服务器上的文件建立一个流的连接,但是这个流是输入流(InputStream),只能读而不能写。(关于流的概念,在第六章有专门介绍)。<br>
2. URLConnection类<br>
使用URL类中openConnection方法可以构造一个URLConnection类。这个类中包含了更丰富的方法,可以对服务器上的文件进行更多的处理。URLConnection类的构造方法是URLConnection(URL),可以构造一个对指定URL的连接对象。用URLConnection的构造方法来构造URLConnection类时,并未建立与指定URL的连接,所以还必须使用URLConnection类中的connect方法建立连接。而用URL类中的openConnection方法来构造时,已建立了连接,就不需要使用connect方法。<br>
3. AppletContext类<br>
AppletContext类是一个接口类,Applet通过AppletContext接口与环境进行通讯。<br>
可以利用这个类从Applet环境获取信息,而这个环境一般是指浏览器。AppletContext类没有构造方法,但可以通过Applet类中的getAppletContext方法获取AppletContext接口使用showStatus方法可以在浏览器的状态条中显示提示信息。使用showDocument方法可以通知浏览器在指定窗口中显示另一个URL的内容。比如要浏览器显示中国教育科研网总节点的主页,可以写成:<br>
String cernet = *http://www.cernet.edu.cn/*; <br>
try {url = new URL(cernet); } <br>
catch (MalformedURLException e) { <br>
…… //出错处理 <br>
} <br>
getAppletContext().showDocument(url); </p>
<p> <a name="532"></a>5.3.2 Socket编程</p>
<p> Socket原先是Unix系统中的概念,以后在网络编程中广泛使用。在Java的Application中可以将Socket类和ServerSocket类分别用于Client端和Server端,在任意两台机器间建立连接。下面来介绍这两个类的使用方法。<br>
1. Socket类<br>
Socket类用在用户端,用户通过构造一个Socket类来建立与服务器的连接。Socket连接可以是流连接,也可以是数据报连接,这取决于构造Socket类时使用的构造方法。一般使用的流连接,流连接的优点是能所有数据都能准确、有序地送到接收方,缺点是速度较慢。Socket类的构造方法有四种。<br>
Socket(String, int)构造一个连接指定主机、指定端口的流Socket。Socket(String, int, boolean)构造一个连接指定主机、指定端口的Socket类,boolean类型的参数用来设置是流Socket还是数据报Socket。Socket(InetAddress,int)构造一个连接指定Internet地址、指定端口的流Socket。Socket(InetAddress,
int,boolean)构造一个连接指定Internet地址、指定端口的Socket类,boolean类型的参数用来设置是流Socket还是数据报Socket。在构造完Socket类后,就可以通过Socket类来建立输入、输出流,通过流来传送数据。<br>
2. ServerSocket类<br>
ServerSocket类用在服务器端,接收用户端传送的数据。ServerSocket类的构造方法有两种。<br>
ServerSocket(int)在指定端口上构造一个ServerSocket类。<br>
ServerSocket(int, int)在指定端口上构造一个ServerSocket类,并进入监听状态,<br>
第二个int类型的参数是监听时间长度。<br>
3. 建立连接<br>
在介绍了Socket类和ServerSocket类后,再来介绍一下连接的过程。<br>
首先,在服务器端构造一个ServerSocket类,在指定端口上进行监听,这将使线程处于等待状态。然后在用户端构造Socket类,与服务器上的指定端口进行连接。服务器监听到连接请求后,就可在两者之间建立连接。建立连接的具体细节对用户是透明的,用户只需要构造这两个类就可以了。在建立连接之后,就可以建立相应的输入、输出流,两端通过流来进行通讯。下面是建立连接的一个例子,接收服务器的IP地址是202.120.88.71,端口号是80。<br>
服务器上的程序:<br>
ServerSocket server;<br>
Socket ssocket; <br>
try { <br>
server = new ServerSocket(80); <br>
svsk = server.accept(); <br>
OutputStream out = serverSocket.getOutputStream(); <br>
out.write(*Test*); <br>
} <br>
catch (IOException e) { <br>
} <br>
用户端的程序:<br>
Socket csocket; <br>
try { <br>
cSocket = new Socket ("202.120.88.71",80); <br> InputStream in =
clientSocket.getInputStream(); <br>
System.out.println("client reads:" + in.read()); <br>
} <br>
catch (UnknownHostException e) { <br>
} <br>
catch (IOException e) { <br>
} <br>
需要说明一下的是,通过Socket建立的流可以是双向的,即在一个Socket的两端可以分别同时建立输入流和输出流。</p>
<p> <a name="533"></a>5.3.3 数据报</p>
<p> 数据报是一种无连接的通信方式,它的速度比较快,但是由于不建立连接,不能保证所有数据都能送到目的地。所以一般用于传送非关键性的数据。发送和接收数据报需要使用Java类库中的DatagramPacket类和DatagramSocket类,下面将详细介绍。<br>
1.DatagramPacket类<br>
它是进行数据报通信的基本单位,它包含了需要传送的数据、数据报的长度、IP地址和端口等。DatagramPacket类的构造方法有两种。<br>
DatagramPacket(byte [],int)构造一个用于接收数据报的DatagramPacket类,byte []类型的参数是接收数据报的缓冲,int类型的参数是接收的字节数。<br>
DatagramPacket(byte [],int, InetAddress,int)构造一个用于发送数据的DatagramPackte类,byte[]类型参数是发送数据的缓冲区,int类型参数是发送的字节数,InetAddress类型参数是接收机器的Internet地址,最后一个参数是接收的端口号。<br>
2. DatagramSocket类<br>
DatagramSocket类是用来发送数据报的Socket,它的构造方法有两种。DatagramSocket()构造一个用于发送的DatagramSocket类。DatagramSocket(int)
构造一个用于接收的DatagramSocket类。构造完DatagramSocket类后,就可以发送和接收数据报。<br>
3. 发送和接收过程<br>
发送数据报,需要在接收端先建立一个接收的DatagramSocket,在指定端口上监听,构造一个DatagramPacket类指定接收的缓冲区(DatagramSocket的监听将阻塞线程)。在发送端需要首先构造DatagramPacket类,指定要发送的数据、数据长度、接收主机地址及端口号,然后使用DatagramSocket类来发送数据报。接收端接收到后,将数据保存到缓冲区,发送方的主机地址和端口号一并保存。随后将接收到的数据报返回给发送方,并附上接收缓冲区地址,缓冲长度、发送方地址和端口号等信息,等待新的数据。下面是一个发送和接收数据报的例子,接收端的IP地址是202.120.88.71,端口号是80,发送的数据在缓冲区message中,长度为200。<br>
接收端的程序:<br>
byte [] inbuffer = new byte[1024]; //接收缓冲 <br>
DatagramPacket inpacket = new DatagramPacket(inbuffer, inbuffer.length);
<br>
DatagramSocket insocket = new DatagramSocket(80); <br>
insocket.receive(inpacket); //监听数据 <br>
String s = new String(inbuffer, 0, 0, inpacket.getlength); //将接收的数据存入字符串s
<br>
发送端的程序: <br>
DatagramPacket outpacket = new DatagramPacket(message,200,"202.120.88.71",80);
<br>
DatagramSocket outsocket = new DatagramSocket();<br>
outsocket.send(outpacket);</p>
<p> </p>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -