Java网络编程2.ppt
n11.1 Java和和Internet 11.2 Socket-编程编程n11.3 URL类类n11.4 Datagram(数据报数据报) 11.1 Java和和Internetn网络定义:网络定义:将分布在不同地理区域的计算机用通信线路互联起来的一个具有强大功能的网络系统网网络络协协议议nInternt提供的服务包括www(World-Wid Web)服务、电子邮件(E-mail)服务、文件传输(FTP)服务和远程登陆(Telnet)服务等网络协议网络协议A网络协议网络协议BTCP/IP协议协议TCP/IP协议协议不同网络之间的互联考完标准语言不同网络之间的互联考完标准语言TCP/IP协议协议nTCP/IP(传输控制协议传输控制协议/网间协议网间协议):internet的主要的主要n协议协议,定义了计算机和外设进行通信所使用的规则定义了计算机和外设进行通信所使用的规则(应用应用n层层,传输层传输层,网络层网络层,链路层链路层).目前最流行的商业化协议目前最流行的商业化协议TCP/IP协议协议(传输控制协议传输控制协议/网间协议网间协议)FTP(文件传输协议文件传输协议):允许网络传输文件允许网络传输文件TELNET(虚拟终端协议虚拟终端协议):允许主机允许主机A远程远程登录主机登录主机BHTTP(超文本传输协议超文本传输协议):允许网络上传输允许网络上传输超文本超文本POP3(邮局协议邮局协议-版本版本3):允许客户程序访允许客户程序访问在远程服务器上的电子邮件问在远程服务器上的电子邮件SMTP(简单邮件传输协议简单邮件传输协议):发送电子邮件发送电子邮件的协议的协议图8.1 TCP/IP协议的层次结构ATMX.25FDDI以太网IPTCPUDPTELNETFTPSMTPWWW 网络接口层 互联网层 传输层 应用层n网络的一些重要术语网络的一些重要术语nDNS(域名服务器域名服务器)n例:例:nIP地址地址:TCP/IP网络中的每台计算机都有唯网络中的每台计算机都有唯一的地址一的地址-IP地址地址.n 例例202.199.28.6 Socket, URL , Datagram是传统网络程序最常用的方式是传统网络程序最常用的方式, ,可以想象为可以想象为两个不同的程序通过网络的通信信道两个不同的程序通过网络的通信信道. .(TCP/IPTCP/IP)是三大功能中是三大功能中最高级的一种最高级的一种, ,通过通过URL JavaURL Java程序可以使用程序可以使用httphttp、filefile、ftpftp等协议,获取远端计算机上的资源信息,等协议,获取远端计算机上的资源信息,方便快捷地开发方便快捷地开发InternetInternet应用程序应用程序更低级的网络传输方式更低级的网络传输方式, ,它把数据的目的它把数据的目的地址在写在数据包中地址在写在数据包中, ,然后将数据包放在网络然后将数据包放在网络上上.(.(UDP)UDP)n .InetAddress类类n作用:作用:存储服务器的存储服务器的IP地址地址,提供一系列静态工提供一系列静态工厂方法。厂方法。n常见方法:常见方法:n(1) InetAddress getLocalHost()n作用:作用:返回本机地址(机器名返回本机地址(机器名+IP) n(2)InetAddress getByName(String )n作用:作用:给定计算机名给定计算机名/域名域名,返回该机的地址。返回该机的地址。 n(3)String getHostAdress()n作用:作用:返回本机返回本机IP地址地址 InetAddressn举例举例1:import .*;public class getLocalHostTest n public static void main(String args)n InetAddress myIP1=null,myIP2=nulln try n myIP1=InetAddress.getLocalHost();n myIP2=InetAddress.getByName(xzh);n catch(UnknownHostException e)n System.out.println(e.toString(); n System.out.println(myIP1=+myIP1.toString();n System.out.println(myIP2=+myIP2.toString();n myIP1=LENOVO-A5267B58/192.168.1.100myIP2=LENOVO-A5267B58/192.168.1.100例例2nimport .*;npublic class getIPn public static void main(String args)n InetAddress IP1=null,IP2=null;n try n n IP1=InetAddress.getByName ();n IP2=InetAddress.getAllByName ();n n catch(UnknownHostException e) n System.out.println(e.toString(); n System.out.println(IP1.toString();n System.out.println(IP2.toString(); n n11.2 Socket-套接字编程套接字编程n服务器:服务器:运行提供服务的程序的计算机运行提供服务的程序的计算机n 侦听建立连接的请求侦听建立连接的请求n客户机:客户机:使用由服务器程序所提供的服务的计算机使用由服务器程序所提供的服务的计算机n 试着与某个服务器建立连接试着与某个服务器建立连接提供电子邮件提供电子邮件服务、服务、QQ聊聊天服务、天服务、MSN聊天服聊天服务、商务网站务、商务网站服务服务收发收发email浏览网页浏览网页收发收发email浏览网页浏览网页服务器客户机如何才能如何才能建立连接建立连接? Socket(套接字)套接字):连接的一个终端:连接的一个终端 Socket=IP+PortSocket的作用:分辨的作用:分辨internet上运行各种服务程序上运行各种服务程序网络服务器网络服务器192.168.12.12Mailftpwww110telnet2123客户程序客户程序SocketIP,port80ServerSocket布满插口的插座板布满插口的插座板插头插头nPort(端口号端口号):TCP/IP协议为每种服务定义了一协议为每种服务定义了一个端口。个端口。n端口号的作用端口号的作用:当一台计算机上运行不同服务器当一台计算机上运行不同服务器程序时程序时,根据端口号不同提供相应的服务根据端口号不同提供相应的服务.n端口号范围:端口号范围:1-65535internet服务服务端口号端口号端口号端口号internet服务服务telnet 23 nntp 119ftp 21 www 80DNS 53 POP3 110nJava的的Socket通信模式通信模式服务器服务器Ss=new ServerSocket(port #)s=Ss.accept()OutputStreamInputStreamSocket.close()ServerSocket.close()客户端客户端new Socket(host, port #)OutputStreamInputStreamSocket.close()Socket向服务器指定端口发出连接请求向服务器指定端口发出连接请求n2实现实现Socket通信通信 ServerSocket类类(布满插口的服务器)(布满插口的服务器) Socket类(插头)类(插头)服务器程序服务器程序n客户端程序客户端程序Mailftpwww110telnet212380客户程序客户程序SocketIP,portnServerSocket类类n作用:作用:负责负责 接受客户连接请求接受客户连接请求n构造函数:构造函数: ServerSocket(int port ) throws IOException ServerSocket(int port ,int backlog ) throws Exception backlog参数:参数:显示设置连接请求的队列长度,只显示设置连接请求的队列长度,只要被加入到连接请求队列才可能与服务器连接成功要被加入到连接请求队列才可能与服务器连接成功nServerSocketServerSocket实例方法:实例方法:nSocket accept()n作用:作用:从连接队列中取一个客户机的连接请求,从连接队列中取一个客户机的连接请求,创建一个与客户连接的创建一个与客户连接的Socket对象对象nInetAddress getInetAddress()n作用:作用:返回服务器返回服务器 socket 的本地地址的本地地址 getLocalPort()n作用:作用:获得本连接的端口号获得本连接的端口号nclose() n作用:作用:使服务器释放占用的端口并断开与所有客使服务器释放占用的端口并断开与所有客户进程的连接户进程的连接nSocket类类n构造函数:构造函数:nSocket( String host , int port) n throws unknownHostException, IOExceptionn作用:作用:试图建立与服务器的连接,如果连接成功返试图建立与服务器的连接,如果连接成功返回一个回一个Socket对象对象n客户连接服务器时可能抛出的异常客户连接服务器时可能抛出的异常nUnknownHostException:无法识别主机名字或无法识别主机名字或IP地址地址nConnectException:服务器进程拒绝连接,或没有服务器服务器进程拒绝连接,或没有服务器 n 进程监听制定端口进程监听制定端口nSocketTimeoutException:等待连接超时等待连接超时nBindException:无法把无法把Socket对象与指定的本地对象与指定的本地IP地址地址n 或或port绑定绑定n实例方法实例方法npublic InetAddress getInetAddress() n作用:作用:返回远程服务器的地址。返回远程服务器的地址。n public InetAddress getLocalAddress() 作用:作用:获得客户本地的获得客户本地的IP地址地址npublic InputStream getInputStream()n作用:作用:获得输入流获得输入流nPublic OutputStream getOutputStream()n作用:作用:获得输出流获得输出流nPublic void close()n作用:作用:关闭关闭Socket连接连接程序举例n功能描述:服务器程序向客户机程序发功能描述:服务器程序向客户机程序发送字符串送字符串 “hihi”服务器程序举例(服务器程序举例(p204)nimport .*; import java.io.*;public class Myservern public static void main(String args)n try ServerSocket serverS=new n ServerSocket(5432);n while(true)n Socket s= serverS.accept();n PrintStream out=new n PrintStream(s.getOutputStream();n out.println(hi);n out.close(); s.close(); n catch(IOException e) 客户机程序举例客户机程序举例(p205)npublic class Myclientn public static void main(String args)n tryn Socket s=new Socket(127.0.0.1,5432); n BufferedReader in=new BufferedReader(new n InputStreamReader(s.getInputStream();n String x=in.readLine();n System.out.println(read from server: +x);n in.close(); n catch(IOException e) read from server: hi3指定一协议编写客户指定一协议编写客户/服务器程序服务器程序程序功能:程序功能:演示一个简单的服务器与客户的交互演示一个简单的服务器与客户的交互即服务器客户机相互通一次信息。即服务器客户机相互通一次信息。ServerSs=new ServerSocket(port #)Socket s=Ss.accept()OutputStreamInputStreamClose SocketClientnew Socket(host, port #) Attempt the connectionOutputStreamInputStreamClose SocketWaiting connecting requirementn服务器规则:服务器规则:n(1 1)向客户机发一个)向客户机发一个 “user:user:”。n(2 2)读取客户机提供的用户名。)读取客户机提供的用户名。n(3 3)如果用户名)如果用户名=“lindalinda” 发送发送“welcome!welcome!”。n(4 4)如果用户名)如果用户名!=!=“lindalinda” 发送发送 “wrong namewrong name”! !。n相应的客户机规则:相应的客户机规则:n(1 1)读取服务器反馈信息。)读取服务器反馈信息。n(2 2)若反馈信息是)若反馈信息是 “user:user:”, ,则向服务器发送用户名并则向服务器发送用户名并n 执行(执行(3 3),若反馈信息不),若反馈信息不 “user:user:”退出。退出。n (3) (3)读取服务器反馈信息。读取服务器反馈信息。n(4 4)若反馈信息是)若反馈信息是 “welcomewelcome”! !则显示登陆成功信息。则显示登陆成功信息。n(5 5)若反馈信息是)若反馈信息是”wrong name!wrong name!”则显示输入错误用则显示输入错误用户名信息。户名信息。n自定义协议规则自定义协议规则8.5 Socket. 8.5 Socket创建服务器创建服务器(端口号端口号)定义数据成员定义数据成员服务器等待服务器等待网络连接网络连接建立建立socket流流读客户读客户 端信息端信息向用户发出一个字符串向用户发出一个字符串创建创建Socket实例实例定义数据成员定义数据成员建立建立socket流流读读socket流流(接收并显示接收并显示)送用户名给送用户名给服务器服务器关闭流关闭流waiting for user127.0.0.1 11111111user:/otherconnetcting client.linda/other提示用户登录成功提示用户登录成功读读socket流流User :lindaWelcome!/wrong nameTry connecting服务器进程服务器进程 客户机进程客户机进程public class ServerRegister public static void main(String args) ServerSocket Ss=new ServerSocket(1111); Socket s=Ss.accept(); PrintStream out=new PrintStream(s.getOutputStream(); BufferedReader in=new BufferedReader( new InputStreamReader(s.getInputStream();服务程序服务程序:tryn while(true) n System.out.println(send to Client:+“user:);n out.println(“user:);n String x=in.readLine();n System.out.println(get from Client: +x);n if ( x.equals(linda) )n System.out.println(send to Client +Login n welcome!); n out.println(“welcome!); n else out.println(“wrong name!); n out.close(); in.close(); s.close();catch(IOException e)n System.out.println(e.toString();ntryString x=in.readLine();nif (x.equals(“user:)n System.out.printlnget from Server: +x); n System.out.println(send to Server: +linda);n out.println(linda);x=in.readLine();n System.out.println(“get from Server+x); n if (x=“welcome!”)n System.out.println(“register successfully”); n if (x=“wrong name”) n System.out.println(“register unsuccessfully”);n else System.exit(0); n out.close(); in.close(); s.close();ncatch(IOException e)n客户机程序:客户机程序:CleintRegister网络服务网络服务4利用线程实现一个服务程序,为多个客户程序提供服务利用线程实现一个服务程序,为多个客户程序提供服务JavaJava如何实现一个服务程序,如何实现一个服务程序,为多个客户程序提供服务为多个客户程序提供服务Mailftpwww110telnet212380客户程序客户程序客户程序客户程序客户程序客户程序客户程序客户程序nclass ServerThread extends Thread nprivate Socket s; static int count=0;nprivate BufferedReader in; PrintStream out;npublic ServerThread(Socket s) throws Exception n this . s=s; count+;n 创建输入输出创建输入输出in 和和out n start(); n public void run()n out.println(hi);n out.println(you are number: +count);n System.out.println(the +count+connecting server);n out.close();n try s.close();catch(Exception e) n提供服务的线程:提供服务的线程:public class multiServern public static void main()throws Exception n ServerSocket Ss=new ServerSocket(5432); n tryn System.out.println(Server);n while(true)n Socket s=Ss.accept();n try new ServerThread( s ); n catch(Exception e) n n finallySs.close(); 000000可以多个客户程序访问的服务器程序可以多个客户程序访问的服务器程序客户机程序testmultinpublic class testmultin public static void main(String args) throws Exception int i=0,len=10; System.out.println(Client:);n Socket s=new Socketlen;n for(i=0;ilen;i+)n si=new Socket(127.0.0.1,5432);n BufferedReader in=new BufferedReader( new n InputStreamReader(si.getInputStream();n PrintStream out=new PrintStream(n si.getOutputStream();n String str1=in.readLine();n String str2=in.readLine();n System.out.println(getting from server: +str1);n System.out.println(getting from server: +str2);n out.close(); si.close();n 5编写简单发送邮件程序编写简单发送邮件程序nSMTP协议协议(Simple Mail Transfer Protocol)nSMTP监听端口号:监听端口号: 25nSMTP客户程序:客户程序:请求发送邮件请求发送邮件nSMTP服务器服务器 程序:程序:负责将邮件发送至目的地负责将邮件发送至目的地n常见邮件收发软件:常见邮件收发软件:n Netscape /OutLook ExpressSMPT命令 说 明HELLO /EHLO指明邮件发送者的主机地址MAIL FROM指明邮件发送者的邮箱地址RCPT TO指明邮件接受者的邮箱地址DATA发送的邮件内容QUIT结束通信HELP查询服务器支持的命令 主要主要SMTP命令命令import java.io.*; import .*;public class MyMailClientnpublic static void main(String args)n trynSocket s=new Socket(,25);nString password=“1234“, String username=xiezhonghong_cn;nusername=new sun.misc.BASE64Encoder().encode(username.getBytes();npassword=new sun.misc.BASE64Encoder().encode(password.getBytes();nPrintStream out=new PrintStream(s.getOutputStream();nBufferedReader in=new BufferedReader(new n InputStreamReader(s.getInputStream(); n out.println(EHLO +xiezhonghong_cn);nSystem.out.println(in.readLine();nout.println(AUTHLOGIN +username+password);nSystem.out.println(in.readLine();nout.println(MAIL FROM: +xiezhonghong_);nSystem.out.println(in.readLine();n out.println(RCPT TO: +xiezhonghong_);nSystem.out.println(in.readLine();n编写一个程序向指定的邮箱发邮件编写一个程序向指定的邮箱发邮件n out.println(DATA);n System.out.println(in.readLine(); n out.println(1111111111n);n out.println(2222222223n);n System.out.println(in.readLine();n out.println(.n);n System.out.println(in.readLine();n out.println(QUIT);n catch(Exception e)nSystem.out.println(error+e.toString();n 有些有些SMTP服务器要求客户提共身份认证,这时客户应先发服务器要求客户提共身份认证,这时客户应先发送送“EHLO”命令,接着发送命令,接着发送“AUTHLOGIN”命令命令11.3 URL类类(Uniform Resource Locator)nURL的值的值:是表示网络上某个资源的地址。:是表示网络上某个资源的地址。nhttp:/:8080/index.html#chapter传输传输协议协议主机主机名名端口端口号号文件文件名名引用引用URL的构造方法的构造方法: (1) URL(String spec)例:例: URL url= new URL (“http:/:8080/cv/index.html”)作用:作用:创建一个能找到该文件的创建一个能找到该文件的URL对象对象 (2)URL(URL u, String spec) 例:例:URL base=new URL(“http:/ URL url1=new (base, “mywork.html”); 构造构造URL类类 (全名全名.URL)URL类的基本方法类的基本方法 String getProtocol() 作用:作用:返回该返回该URL对象使用的传输协议对象使用的传输协议 String getHost() int getPort() String getFile() String getRef() nURL类的基本方法类的基本方法构造构造URL的实例的实例import .URL ; import java.io.*;import .MalformedURLException;public class testURLpublic static void main(String args) URL url1; try url1=new URL (http:/:8080/cv/index.html); displayURL(url1); /displayContent(url1) ; catch (MalformedURLException e) System.out.println(e.toString(); public static void displayURL(URL url) System.out.println(URL is ); System.out.println(url.toString(); System.out.println(url.getProtocol(); System.out.println(url.getHost(); System.out.println(url.getPort(); System.out.println(url.getFile(); System.out.println(url.getRef(); n使用字节流访问使用字节流访问URL资源资源nURL类的一个方法:类的一个方法:nInputStream openStream()n作用:作用:返回一个输入流对象,数据源是返回一个输入流对象,数据源是URL对象所指的地址。对象所指的地址。npublic static void displayContent(URL url) n int c;n InputStreamReader in=new n InputStreamReader(url.openStream();n BufferedReader bin=new BufferedReader(in);n FileOutputStream fout=new n FileOutputStream(d:/njau.txt);n while(c=(char)bin.read()!=-1)n fout.write(char)c);n System.out.print(char)c); n bin.close(); fout.close(); n n针对针对HTTP协议的协议的URLConnection类类nURLConnection类的作用类的作用:n作用:作用:访问远程资源,和它建立连接。访问远程资源,和它建立连接。n(探测到这个远程对象的属性下载、阅读该远程资源探测到这个远程对象的属性下载、阅读该远程资源)n使用方法:使用方法:nURL myurl= new URL(“http:/ myuc= n myurl.openConnection();nURLConnection类常见实例方法类常见实例方法nint getContentLength()n作用:访问对象的长度作用:访问对象的长度nString getContentType()n作用:访问对象的类型作用:访问对象的类型nlong getDate()n作用:访问对象的当前日期作用:访问对象的当前日期nInputStream getInputStream()n作用:返回输入流对象,数据源是访问的该对象作用:返回输入流对象,数据源是访问的该对象nOuputStream getOuputStream()n作用:返回输出流对象,输出目的地是访问的该对象作用:返回输出流对象,输出目的地是访问的该对象n程序示例:程序示例:n通过通过java提供的提供的URL类和类和URLConnection,从指定的从指定的网址上下载网页网址上下载网页public class UseURLConnection public static void main(String args) throws Exception URL urlname = new URL(http:/); URLConnection uc =urlname.openConnection(); UseURLConnection x=new UseURLConnection(); x.downloadContent(urlname, uc); public static void download(URL urlname, URLConnection uc ) n char c;n tryn InputStream in=uc. getInputStream( );n FileOutputStream fout=new n FileOutputStream(d:/njau.txt);n while(c=(char)in.read()!=-1)n fout.write(char)c);n System.out.print(char)c); n in.close(); fout.close();n catch(IOException e)n System.out.println(e.toString();n nURL html=getDocumentBase();n/返回当前返回当前Applet所在的所在的HTML文件的文件的URLnSystem.out.print(html);nURL codebase=getCodeBase();n/返回当前返回当前AppletL文件的文件的URLnSystem.out.print(codebase);获取小应用程序获取小应用程序HTML页面的页面的URL和小和小应用程序本身的应用程序本身的URL的方法的方法浏览器浏览器服务器服务器htmlappletweb pageimport java.applet.*;import java.awt.*;public class image extends Applet Image img; public void init() img=getImage(getCodeBase(),“IMAGES/FRUIT.JPG); public void paint(Graphics g) int width=img.getWidth(this);int height=img.getHeight(this); g.drawRect(52,52,width+30,height+30); g.drawImage(img,57,57,width+20,height+20,this);11.4Datagram(数据报数据报)TCP/IP 协议协议:基于套接字具有高度的可靠性:基于套接字具有高度的可靠性UDP协议协议(User Datagram Protocol) 到达时间到达时间,以及内容不能得到保证。以及内容不能得到保证。socketserverclientdatagramserverclientJava如何实现如何实现数据报服务呢?数据报服务呢?n.建立一个数据报收发器建立一个数据报收发器DatagramSocket对象对象;建立一个报文包建立一个报文包Datagrampacket等待网络某站点发等待网络某站点发过来的请求报文包过来的请求报文包建立数据报收发器建立数据报收发器Datagramsocket对象对象创建一请求报文包创建一请求报文包发出请求报文包发出请求报文包获得请求报文包获得请求报文包截取对方地址截取对方地址创建带发送地址创建带发送地址的报文包的报文包发送出去发送出去创建接收包创建接收包等待接收等待接收服务器发送报文服务器发送报文客户机接收报文客户机接收报文报文收发器类报文收发器类 DatagramSocket作用:作用:收发数据包收发数据包与与Socket类的不同点:类的不同点:不存在一对一的连接,不存在一对一的连接, 也不存在等待连接问题。也不存在等待连接问题。构造函数:构造函数:DatagramSocket( int port) DatagramSocket( ) 方法:方法: receive(报文包报文包) send(报文包报文包)n 报文包类报文包类DatagramPacket类类n作用:作用:存放接受或要发送出去的报文。存放接受或要发送出去的报文。n接受报文时报文包构造函数接受报文时报文包构造函数:nDatagramPacket ( byte buf, n int length)n发送报文时报文包构造函数:发送报文时报文包构造函数:nDatagramPacket ( byte buf, n int length, InetAdress add, int port);n方法:方法: nInetAddress getAddress(): 获得报文获得报文包来源的包来源的IP地址地址/或报文包正发送的目的或报文包正发送的目的地地IPnInt getPort(): 同上同上nByte getData():返回收到报文的内容返回收到报文的内容或发出报文的内容或发出报文的内容n 服务器发送报文的标准步骤如下服务器发送报文的标准步骤如下:n1. 定义数据成员定义数据成员n DatagramSocket DataSR;n DatagramPacket Datapacket;n InetAddress address;/用来存放接收方的地址用来存放接收方的地址)n int port; /用来存放接收方的端口号用来存放接收方的端口号)n byte Buf=new byte256; /设定缓冲区,存设定缓冲区,存 n 放从接收放从接收/发出信息发出信息n2. 创建数据收发器创建数据收发器DatagramSocket对象对象n try DataSR=new DatagramSocket(5432);n catch(Ex