Java语言程序设计Java网络编程网络协议url编程socket编程JAVA语言程序设计清华大学刘宝林3网络环境中的javajava语言是Internet上的世界语。借助HTML从网上下载applet在程序中通过URL访问网上资源通过java.net包中的类直接在程序中实现网络通讯JAVA语言程序设计清华大学刘宝林4网络协议应用层:使用URL、URLConnection类传输层:使用Socket、ServerSocket类Application(HTTP,FTP,telnet)Transport(TCP,UDP,..)Network(IP…)Link(devicedriver)Physics一般应用程序是靠TCP(而不是IP)实现通讯功能,因为它们需要大量数据的无差错传输。JAVA语言程序设计清华大学刘宝林5URL统一资源定位符URL(UniformResourceLocator)–用字符串表示Internet网络上资源的地址–包括两部分使用的协议(http,ftp,gopher,file…)资源位置资源位置–主机名,即域名,如,也可使用IP地址JAVA语言程序设计清华大学刘宝林6URL–端口号,为访问资源时应连接的服务器的地址,当地址为缺省的时,可省略不写–路径名,资源文件在机器中的路径,一般为文件路径,但也可以是执行CGI程序的命令–引用,指向资源文件的某一个位置语言程序设计清华大学刘宝林7URLURL—UniformResourceLocator指向WorldWideWeb上的一个资源。协议名(http、ftp、file等)资源位置(主机域名,也可用IP地址)端口号(服务器监听程序的端口。,FTP21,Telnet23)路径名(文件在机器中的路径名。资源文件或CGI程序等)引用(#指向资源文件的某一个位置)JAVA语言程序设计清华大学刘宝林8URL类java.net.URL–创建URL对象代表一个URL资源构造函数–URL(Stringspec)URLurl1=newURL(“”);–URL(URLbaseURL,StringrelativeURL)URLurl2=newURL(url1,“file.html”);如:try{URLurl1=newURL()URLurl2=newURL(url1,“index.html”);}catchMalformedURLExceptionJAVA语言程序设计清华大学刘宝林9URL类–URL(Stringprotocol,Stringhost,intport,Stringfile)–URL(Stringprotocol,Stringhost,Stringfile)使用缺省80端口–构造函数抛出MalformedURLException获取URL信息的一些方法–getProtocol(),getHost(),getPort(),getFile(),getRef()–例:ParseURL.javaJAVA语言程序设计清华大学刘宝林10URL类方法方法1取出URL的指定成分信息url1.getProtocol()url1.getHost()url1.getPort()url1.getFile()方法2InputStreamurl1.openStream()1JAVA语言程序设计清华大学刘宝林11利用URL获取网络资源创建URL对象使用URL对象的openStream()方法,返回一个InputStream。从此InputStream读入即可。例:URLReader.javaJAVA语言程序设计清华大学刘宝林12URLConnection类一个URLConnection对象代表一个Java程序与URL资源的通讯连接。通过它可对这个URL资源读或写。通过openConnection方法,获得URLConnection类对象URLConnectionurl1.openConnection()–成功,返回一个URLConnection对象–不成功,抛出IOException例外URLConnection类的读写渠道getInputStream()getOutputStream()URL资源2JAVA语言程序设计清华大学刘宝林13URLConnection从URLConnection读–getInputStream()例:URLConnectionReader.java向URLConnection写–什么情况下有必要向URL写信息呢?–表单(Form)与CGI-有交互的网页–使用POST方式向CGI传送信息–setDoOutput(true),getOutputStream()例:Reverse.javaCGI程序POST信息有动态特性的HTML网页标准输入标准输出JAVA语言程序设计清华大学刘宝林14InetAddress类表示一个IP地址类方法:–staticInetAddressgetByName(String)–staticInetAddressgetLocalHost()用于创建IP地址实例:InetAddressip1=InetAddress.getLocalHost();InetAddressip2=InetAddress.getByName(166.111.7.250);InetAddressip3=InetAddress.getByName();3JAVA语言程序设计清华大学刘宝林15InetAddress类其他方法–StringgetHostAddress():返回“%d.%d.%d.%d”形式的IP地址–StringgetHostName():返回主机名–StringtoString()如:ip1.getHostName()ip1.getHostAddress()例:MyIPAddress.javaJAVA语言程序设计清华大学刘宝林16传输层协议TCP与UDPTCP(TransportControlProtocol)–两主机之间有连接的、可靠的、端对端(end-to-end)的数据流的传输–如http,ftp,telnet的传输层均使用此协议UDP(UserDatagramProtocol)–从一台机器向另一台机器以无连接的、数据报的方式进行通讯的协议–如:email可以使用UDPJAVA语言程序设计清华大学刘宝林17主机与端口如何确定通讯的目标,两部分:–主机使用IP地址或域名–端口,用于区分同一台主机上的不同的进行通讯的应用进程端口–0~1023系统使用–1024~65535用户使用,最好8000以上JAVA语言程序设计清华大学刘宝林18Socket通信端到端的连接与通信网络上的两个程序(进程)通过一个双向的通信连接实现数据的交换。双向链路的一端称为一个socket(套接字)主机—端口(用于区分同一台主机上的不同的通信应用进程:0~1023系统1024~65535用户)JAVA语言程序设计清华大学刘宝林19TCP与Socket有连接的服务中,服务器进程端口绑定一个Socket,监听客户请求请求服务进程响应请求服务进程与客户进程各绑定一个Socket,进行相互通讯。JAVA语言程序设计清华大学刘宝林20UDP与Datagrams使用UDP协议传送数据时,把数据分割为各自独立的多个数据报(Datagrams),分别发送,数据报是否到达、到达顺序以及内容是否正确不保证。IP以及端口地址包含在报头中JAVA语言程序设计清华大学刘宝林21使用Socket编程使用socket在Client程序和Server程序间建立连接、通讯的通道对于任一端来说与对方的通信会话就是–打开socket(建立连接)–从socket中读数据/向socket中写数据–关闭socket(拆除连接)JAVA语言程序设计清华大学刘宝林22Socket编程步骤创建socket打开连接到socket的输入/输出流。按照一定的协议对socket进行读写操作,实现所要完成的主要工作。关闭socketJAVA语言程序设计清华大学刘宝林23Socket类构造函数:Socket(InetAddressaddr,intport)Socket(Stringaddr,intport)–因是TCP支持类,所以需要端口号。–使用该类——扮演客户机的角色。–TCP连接会涉及客户机/服务器双方端口号。但客户机端口由TCP/IP软件自动分配。方法:InputStreamgetInputStream();outputStreamgetoutputStream();JAVA语言程序设计清华大学刘宝林24使用Socket编程Server端通讯过程Client端通讯过程在某端口创建ServerSocket对象提供监听等待并接收Client端的请求利用返回的Socket对象与Client端通讯关闭Socket结束与此Client的通讯关闭监听创建Socket对象向Server某端口请求利用此Socket对象与Server端通讯关闭Socket结束与此Server的通讯建立连接数据通讯拆除连接JAVA语言程序设计清华大学刘宝林25socket通信Client//试图连接Socket(host;port#)OutputStreamInpotStreamSocket.close()Server//占用某个端口ServerSocket(hostport)//等待连接ServerSocket.accept()Socket()OutputStreamInpotStreamSocket.close()JAVA语言程序设计清华大学刘宝林26Socket与I/O流一个socket可以持有两个流—输入流与输出流JAVA语言程序设计清华大学刘宝林27Client端用Server端主机号,端口号创建Socket对象SocketmClient=newSocket(166.111.3.3,8010);利用Socket实现网络I/OInputStreamrDIn=mClient.getInputStream();OutputStreamrD=mClient.getOutputStream();DataInputDin=newDataInputStream(rDIn);DataOutputDout=newDataOutputStream(rD);关闭Socket,结束通讯mClient.close();JAVA语言程序设计清华大学刘宝林28c/s例—client端importjava.io.”importjava.net.*publicclassc{pbulicstaticvoidmain(Stringargs[]){try{Socketsocket=newSocket(“127.0.0.1”,8888);BufferedReadersin=newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWritersout=newPrintWriter(socket.getOutputStream());BufferedReaderinput=newBufferedReader(newInputStreamReader(System.in));JAVA语言程序设计清华大学刘宝林29c/s例—client端Stringask=input.readln();while(!ask.eq