资源预览内容
第1页 / 共47页
第2页 / 共47页
第3页 / 共47页
第4页 / 共47页
第5页 / 共47页
第6页 / 共47页
第7页 / 共47页
第8页 / 共47页
第9页 / 共47页
第10页 / 共47页
亲,该文档总共47页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第14章 网络编程,14.1 URL类,URL类是包中的一个重要类,URL的实例封装着一个统一资源定位符(Uniform Resource Locator),使用URL创建对象的应用程序称作客户端程序。一个URL对象封装着一个具体的资源的引用,表明客户要访问这个URL中的资源,客户利用URL对象可以获取URL中的资源。一个URL对象通常包含最基本的个部分信息:协议、地址、资源。,关于协议、地址和资源,协议必须是URL对象所在的java虚拟机支持的协议,常用的协议有HTTP、FTP、File协议都是虚拟机支持的协议; 地址必须是能连接的有效IP地址或域名; 资源可以是主机上的任何一个文件。,14.1.1 URL的构造方法,public URL(String spec) throws MalformedURLException 例: import .*; try URL url=new URL(“”); catch(MalformedURLException e) System.out.println(“Bad URL:”+url); ,URL的另一构造方法,public URL(String protocol, String host, String file) throws MalformedURLException,14.1.2 读取URL中的资源,URL对象调用InputStream openStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端。URL对象调用InputStream openStream()方法可以返回一个输入流,该输入指向URL对象所包含的资源。通过该输入流可以将服务器上的资源读入到客户端。,读取URL中的资源的示例代码(1),import .*; import java.io.*; import java.util.*; class Look implements Runnable URL url; public void setURL(URL url) this.url=url; public void run() try InputStream in =url.openStream(); byte b=new byte1024; int n=-1; while(n=in.read(b)!=-1) String str =new String(b,0,n); System.out.print(str); catch(IOException exp)exp.printStackTrace(); ,读取URL中的资源的示例代码(1),public class TestURL public static void main(String args) Scanner scanner; URL url; Thread readURL; Look look =new Look(); System.out.println(输入URL资源,例如:); scanner = new Scanner(System.in); String source = scanner.nextLine(); try url=new URL(source); look.setURL(url); readURL=new Thread(look); catch(Exception exp)System.out.println(exp); readURL=new Thread(look); readURL.start(); ,14.2 InetAdress类,14.2.1 地址的表示,Internet上的主要有两种表示地址的方式: 域名: 例如, IP地址: 例如,202.108.35.210 包中的InetAddress类对象含有一个Internet主机域名和IP地址: ,14.2.2 获取地址,获取Internet上的地址,可以使用InetAddress类的静态方法: getByName(String s); 将一个域名或IP地址传递给该方法的参数s,获得一个InetAddress对象,该对象含有主要地址的域名和IP地址,该对象用如下格式表示它包含的信息:,import .*; public class TestAddress public static void main(String args) try InetAddress address_1= InetAddress.getByName(); System.out.println(address_1.toString(); InetAddress address_2= InetAddress.getByName(166.111.222.3); System.out.println(address_2.toString(); catch(UnknownHostException e) System.out.println(无法找到 ); ,InetAddress其它常用方法,public String getHostName():获取InetAddress对象所含有的域名。 public StringHostAddress():获取InetAddress对象所含的IP地址。 public static InetAdress getLoalHost()获得含有本地机的域名和地址的InetAddress的对象。,14.3 套接字Scoket,2. 获取本地机的地址,getLocalHost():可获得一个InetAddress对象,该对象含有本地机的域名和IP地址。,14.3.1 套接字,网络通信使用IP地址标识Inernet上的计算机,使用端口号标识服务器上的进程(程序)。如果服务器上的一个程序不占用端口号,用户程序就无法找到它,就无法和该程序交互信息。端口与被规定为一个16位的整数,其中,0-1023被预告定义的服务通信占用。 当两程序需要通信时,它们可以通过使用Socket类建立套接字对象并连接在一起。,14.3.2 客户端套接字,客户端的程序使用Socket类建立负责连接到服务器的套接字对象。 Socket的构造方法是 Socket Socket(String host, int port) 参数host是服务器的IP地址。 port是一个端口号。 建立套接字对象可能发生IOExcepion异常。,客户端的数据接收与发送,使用套接字对象的getInputStream()方法可以获得一个输入流,客户端用这个输入流读取服务器端发来的数据。 使用套接字对象的getOutputStream()方法可获得一个输出流,客户端用这个输出流向服务器端发送数据。,14.3.3 服务器端套接字,为了能使客户端成功地连接到服务器,服务器建立一个ServerSocket对象,该对象通过将客户端的套接字对象和服务器端的一个套接字对象连接起来,达到连接的目的。,ServerSocket的构造方法,ServerSocket(int port) port是一个端口号。 当建立ServerSocket对象时可能发生IOException 异常。,try ServerSocket serverForClient = new ServerSocket(2010); catch(IOException e),ServerSocket的accept()方法,当服务器的ServerSocket对象建立后,就可以使用accept()方法将客户的套接字和服务器端的套接字连接起来。如果没有客户端的连接请求accept()方法会堵塞线程的继续执行。直到接到某个客户的请求为止。 为了避免长时间的阻塞,服务器端可以使用setSoTimeout(int timeout)方法,在堵塞时间超过timeout时,捕获SocketTimeoutException来终止堵塞。,try Socket sc=severForClient.accept(); catch(IOException e) System.out.println() ,获得输入、输出流,驻留在服务器端和客户端的Socket对象调用getOutputStream()及getInputStream()获得输出及输入流。通过这两个流可以实现服务器端和客户的数据交换。,简单网络通信实例 (客户端),import java.io.*; import .*; public class Client1 public static void main(String args) String mess=+2什么情况下不等于3?,一周有几天?,什么东西能看,能吃,能坐?; Socket mysocket; DataInputStream in=null; DataOutputStream out=null; try mysocket=new Socket(127.0.0.1,2010); in=new DataInputStream(mysocket.getInputStream(); out=new DataOutputStream(mysocket.getOutputStream(); for(int i=0;imess.length;i+) out.writeUTF(messi); String s=in.readUTF(); System.out.println(客户端收到服务器回答+s); Thread.sleep(500); catch(Exception e)System.out.println(服务器已断开!); ,简单网络通信实例 (服务器端),import java.io.*; import .*; public class Server public static void main(String args) String answer=在算错的情况下,七天,不知道!; ServerSocket serverForClient=null; Socket socketOnServer=null; DataInputStream in=null; DataOutputStream out=null; try serverForClient= new ServerSocket(2010); catch(IOException e1)System.out.println(e1.toString(); try System.out.println(等待客户端呼叫:); socketOnServer=serverForClient.accept(); out=new DataOutputStream(socketOnServer.getOutputStream(); in=new DataInputStream(socketOnServer.getInputStream(); for(int i=0;ianswer.length;i+) String s=in.readUTF(); System.out.println(服务器收到客户端的提问+s); out.writeUTF(answeri); Thread.sleep(500); catch(Exception e)System.out.println(e.toString(); ,14.3.4 使用多线程技术,服务器在同时与多个客户端进行通信时可使用多线程的方法,为每一个客户端建立一个
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号