这章看的有点吃力,还是不太懂,以后实践中运用吧。列下知识点吧
Java中的网络编程
如果地址唯一标识了Internet上的计算机,则URL标识了计算机上的资源,更具体地说,URL(Uniform Resource Locator,统一资源定位器)充当一个指针,
指向Web上 的网页、二进制文件以及其他信息对象。当手工输入如:http://www.tsinghua.edu.cn/hotlink.html的网址时,实际上就提供了该站点的主页的URL。
一个URL通常包含了如下信息:
1.http-超文本传输协议
2.dlrin.edu.cn-存储资源的计算机的域名地址
3.hotlink.html-资源
java.net包中的URL类是对URL的抽象,使用URL创建对象的应用程序称为客户端程序。
一个URL对象存放着一个具体的资源的引用,表明客户要访问这个URL中的资源,利用URL对象可以获取URL中的资源。一个URL对象通常包含最基本的三部分信息:协议、地址、资源。
协议必须是URL对象所在的java虚拟机支持的协议,常用的HTTP、FTP、FILE协议都是java虚拟机支持的协议。地址必须时能连接的有效的IP地址或域名。
资源可以使主机上的任何一个文件。
URL的构造方法:
public URL(String spec) throws MalformedURLException——使用字符串初始化一个URL对象,例如:
try{url=new URL(“http://yahoo.com.cn”);
}
catch(MalformedURLException e){
System.out.println(“Bad URL”+url); }
该URL对象使用的协议是HTTP,即用户按照这种协议与指定的服务器通信,该URL对象包含的地址是“yahoo.com.cn”,所包含的资源是默认的资源(主页)。
public URL(String protocol,String host,String file) throws MalformedURLException——构造的URL对象、协议、地址和资源分别由参数protocol、host和file指定。
读取URL中的资源
URL对象调用InputStream openStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端。
JEditorPane类的构造方法:
public JEditorPane()
public JEditorPane(URL initialPage) throws IOException
public JEditorPane(String url) throws IOException
可以构造JEditorPane对象。后两个方法使用参数initialPage或url指定该对象最初显示的URL中的资源。
JEditorPane对象调用方法:
public void setpage(URL page) thows IOException方法可以显示新的URL中的资源。
有时候我们想看网页的运行效果。javax.swing包中的JEditorPane类可以解释执行html文件。
也就是说,如果把html文件读入到JEditorPane,该文件就会被解释执行,显示在JEditorPane中,这样程序就看到了网页的运行效果。
用户如果单击网页中的超链接,还可以使得JEditorPane对象触发HyperlinkEvent事件。程序可以通过处理HyperlinkEvent事件来显示新的URL资源
JEditorPane对象调用addHyperlinkListener(HyperlinkListener listener)方法获得监视器。监视器需实现HyperlinkListener接口,接口中方法如下:
void hyperlinkUpdate(HyperlinkEvent e)
类javax.swing.event.HyperlinkEvent中的方法:
getEventType()——获得事件类型。
返回表示类型的HyperlinkEvent.EventType类常量:
ACTIVATED ——激活类型。ENTERED——进入类型。
EXITED——退出类型。
域名容易记忆,当你在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样我们才能和主机建立连接。
获取Internet上主机的地址
使用InetAddress类的静态方法:
getByName(String s);将一个域名或IP地址传递给该方法的参数s,获得一个 InetAddress对象,该对象含有主机地址的域名和IP地址,该对象用如下格式表示它包含的信息:ww.sina.com.cn/202.108.37.40。
InetAddress类中含有两个实例方法:
public String getHostName()——获取InetAddress对象所含的域名。
public String getHostAddress()——获取InetAddress对象所含的IP地址。
获取本地机的地址
我们可以使用InetAddress类的静态方法:getLocalHost();
获得一个InetAddress对象,该对象含有本地机的域名和IP地址。
IP地址标识Internet上的计算机,端口号标识正在计算机上运行的进程(程序)。端口号与IP地址的组合得出一个网络套接字(Socket)。
端口号被规定为一个16位的整数0~65535。其中,0~1023被预先定义的服务通信占用(如telnet占用端口23,http占用端口80等)。
除非我们需要访问这些特定服务,否则,就应该使用1024~65535这些端口中的某一个进行通信,以免发生端口冲突。当两个程序需要通信时,
它们可以通过使用Socket类建立套接字对象并连接在一起。
当建立服务器套接字时可能发生IOException异常,因此要象下面那样建立接收客户的服务器套接字。
try{
ServerSocket waitSocketConnection=new ServerSocket(1880); }
catch(IOException e){}
当服务器的ServerSocket对象waitSocketConnection建立后,就可以使用方法accept()接受客户的套接字连接请求。
接收客户的套接字也可能发生IOException异常,因此要按照下面那样建立接受客户的套接字。
try{
Socket socketAtServer= waitSocketConnection.accept(); }
catch(IOException e){}
所谓接收客户的套接字请求,就是accept()方法会返回一个Socket对象socketAtServer,称作服务器端的套接字对象。
但是,accept()方法不会立刻返回,该方法会堵塞服务器端当前线程的执行,直到有客户端请求建立套接字连接。如果没有客户请求建立套接字连接,
那么下面的 System.out.println(“ok”);这段代码总不会执行:
try{
Socket socketAtServer = waitSocketConnection.accept();
System.out.println(“ok”);
}
catch(IOException e){}
注:ServerSocket对象可以调用setSoTimeout(int timeout)方法设置超时值(单位是毫秒数), timeout是一个正值。当ServerSocket对象调用accept()方法堵塞的时间一旦超过timeout时,将触发SocketTimeoutException。
创建Socket对象可能发生IOException异常,因此要象下面那样建立到服务器的套接字连接
try{
Socket socketAtClient=new Socket(“192.168.0.78”,1880); }
catch(IOException e){}
也可以使用Socket类不带参数的构造方法public Socket()创建一个套接字对象,该对象不请求任何连接。该对象再调用
public void connect(SocketAddress endpoint) throws IOException
请求和参数SocketAddress指定地址的套接字建立连接。为了使用connect()方法,可以使用SocketAddress的子类:InetSocketAddress创建一个对象。
InetSocketAddress的构造方法是:
public InetSocketAddress(InetAddress addr, int port)
套接字连接中涉及到输入流和输出流操作,客户或服务器读取数据可能会引起堵塞,我们应把读取数据放在一个单独的线程中去进行。
另外,服务器端收到一个客户的套接字后,就应该启动一个专门为该客户服务的线程。
可以将计算量大的工作放在服务器端,客户负责计算量小的工作,实现客户-服务器交互计算,来完成某项任务。仍然是先将服务器程序运行起来,然后等待客户端程序的运行。
详见课本P260(java大学实用教程第二版)