⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jv0503.htm

📁 很不错到
💻 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>&nbsp;</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>&nbsp;</p>
</BODY>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -