025 026 网络编程_Socket.ppt
Java高级程序设计高级程序设计专业教程专业教程理论讲解部分理论讲解部分 VerVer 3.1 3.120061 1 1 1第第第第4 4章章章章 网络编程网络编程网络编程网络编程课程概述课程概述Internet协议组客户/服务器计算模式Socket类ServerSocket类重点重点Socket类ServerSocket类难点难点Socket类ServerSocket类 学习目标学习目标掌握客户机/服务器(C/S)编程模式掌握Socket网络编程20062 2 2 2第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.1 Internet协议组4.1.1 Internet简介Internet上的计算机通过交换数据包来进行通信。如众所周知的Internet协议包,或IP包 IP包通过特殊的路由算法从发送包的源计算机邮递到接收包的信宿计算机。Internet上的所有计算机都是利用一个或多个IP地址来标识的。20063 3 3 3第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.1 Internet协议组4.1.1 Internet简介 IP地址可以以十进制、十六进制或域名表示,但最常用的格式是用点分开的十进制格式。IP地址是0 xCCD499C1 十进制格式是204.212.153.193 20064 4 4 4第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.1 Internet协议组4.1.1 Internet简介端口用来允许程序间的通信。端口地址是 16 位的地址 端口端口端口端口协议协议协议协议21文件传输协议23Telnet 协议(远程通信网络协议)25简单邮件传输协议80超级文本传输协议20065 5 5 5第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.1 Internet协议组4.1.2 面向连接与非连接通信的比较TCP是面向连接的协议,而UDP是非连接的传输协议。TCP面向连接的协议在信源端口(端口与IP 地址)与信宿端口(端口与IP 地址)之间建立了通信链接。这些端口通过该链接联编到一起直到连接终止,链接也随之断开。当使用UDP时,应用程序在数据报上写下信宿端口与IP地址,然后将数据报发送到其目的地。UDP不如TCP可靠,因为在UDP协议中没有内嵌发送保证或错误检测与纠正机制。20066 6 6 6第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.1 Internet协议组4.1.2 面向连接与非连接通信的比较 应用程序协议如FTP、SMTP以及HTTP使用TCP在客户与服务器程序之间提供了可靠的、基于流的通信。20067 7 7 7第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.2 客户/服务器计算模式与Internet Web提供了客户/服务器计算模式的一个很好的例子。Web浏览器是客户,Web服务器是服务器。浏览器以用户的名义通过建立与Web服务器的连接,并将文件请求提交给服务,而向Web服务器请求HTML文件。服务器收到文件请求后,检索文件,然后通过已建立的连接将文件发送给浏览器。浏览器收到文件,并将文件显示到浏览器窗口。20068 8 8 8第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.2 客户/服务器计算模式与Internet4.2.1 套接字与客户/服务器通信 客户与服务器通过套接字建立连接与通信。连接是使用TCP通过Internet创建的通信链接。一些客户/服务器应用程序也是围绕非连接的UDP创建的。这些应用也使用套接字进行通信。套接字是Internet通信的末端点。20069 9 9 9第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.2 客户/服务器计算模式与Internet4.2.1 套接字与客户/服务器通信 当使用非连接协议时,客户与服务器通过向对方的套接字发送数据报进行通信。UDP 用于非连接的协议。它不支持像TCP那样可靠的通信。客户创建客户套接字,并将它们与服务器套接字连接起来。套接字与主机地址及端口地址相关。主机地址是客户或服务器程序所在的主机的IP地址。端口地址是客户或服务器程序所使用的通信端口。服务器程序使用与它们的应用程序协议相关的端口号。200610101010第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.3 概述包提供了几种支持基于套接字的客户/服务器通信的类。InetAddress类封装了Internet IP地址,并支持用点分开的地址与主机名称之间的转换。Socket、Serversocket以及DatagramSocket类为面向连接的与非连接的通信实现了客户与服务器套接字。200611111111第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.4 InetAddress 类InetAddress类封装了Internet地址。它支持数字IP地址和主机名。getLocalHost()方法是静态方法,它返回一个代表本地宿主计算机Internet地址的InetAddress对象。静态的getByName()方法为指定的主机返回 InetAddress对象。静态的getAllByName()方法返回与特殊主机相关的所有Internet地址的数组。200612121212第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.4 InetAddress 类getAddress()方法获得由InetAddress对象标识的主机的数字IP地址 getHostName()方法则获得它的域名。equals()、hashCode()以及toString()方法覆盖了Object类的这些方法。200613131313第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.4 InetAddress 类import .InetAddress;import .UnknownHostException;import java.lang.System;public class NSLookupApp public Static void main(String args)try if(args.length!=1)System.out.println(“Usage:java NSLookupApp hostname”);return;200614141414第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.4 InetAddress 类 InetAddress host=InetAddress.getByName(args0);String hostname=host.getHostName();byte ipAddress=host.getAddress();System.out.println(“Host name:”+hostName);System.out.print(“IP address:”);for(int i=O;ijava NSLookupApp Host name:IP address:192.9.9.1可以用其它的Internet主机名试一试以查找它们的IP地址。200617171717第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类Socket类实现基于连接的客户套接字。getInetAddress()与getPort()方法获得信宿机与套接字所连接的信宿主机端口号的IP地 址。getLocalPort()方法返回与套接字相关的信源主机本地端口号。getInputStream()与getOutputStream()方法用来访问与套接字相关的输入与输出流。close()方法用来关闭套接字。200618181818第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类import java.lang.System;import .Socket;import .InetAddress;import .UnknownHostExceptlon;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;200619191919第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类public class PortTalkApppublic static void main(String args)PortTalk portTalk=new PortTalk(args);portTalk.displayDestinationParameters();portTalk.displayLocalParameters();portTalk.chat();portTalk.shutdown();200620202020第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类class PortTalk Socket connection;DataOutputStream outStream;DataInputStream inStream;public PortTalk(String args)if(args.length!=2)error(“Usage:java PortTalkApp host port”);String destination=args0;int port=0;try port=Integer.valueOfurgs1).intValue();catch(NumberFormatException ex)error(“Invalid port number”);200621212121第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类 try connection=new Socket(destination,port);catch(UnknownHostException ex)error(“Unknown host);catch(IOException ex)error(IO error creating socket”);try inStream=new DataInputStream(connection.getInputStream();outStream=new DataOutputStream(connection.getOutputStream();catch(IOException ex)error(“IO error getting streams”);System.out.println(“Connected to”+destination+”at port”+port+”.”);200622222222第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类 public void displayDestinationParameters()InetAddress destAddress=connection.getInetAddress();String name=destAddress.getHostName();byte ipAddress=destAddress.getAddress();int port=connection.getPort();displayParameters(Destination”,name,ipAddress,port);200623232323第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类 public void displayLocalParameters()InetAddress localAddress=null;try localAddress=InetAddress.getLocalHost();catch(UnknownHostException ex)error(“Error getting local host information”);String name=localAddress.getHostName();byte ipAddress=localAddress.getAddress();int port=connection.getLocalPort();displayParameters(“Local”,name,ipAddress,port);200624242424第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类 public void displayParameters(String s,String name,byte ipAddress,int port)System.out.println(s+”host is“+name+”.”);System.out.print(s+”IP address is“);for(int i=O;i0)line=line.toUpperCase();200626262626第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类 switch(line.charAt(O)case S:String sendLine=keyboardInput.readLine();outStream.writeBytes(sendLine);outStream.write(13);outStream.write(10);outStream.flush();break;200627272727第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类 case R:int inByte;System.out.print(“*”);while(inByte=inStream.read()!=n)System.out.write(inByte);System.out.println();break;case Q:finished=true;break;default:break;200628282828第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类 catch(IOException ex)error(“Error reading from keyboard or socket”);while(!finished);public void shutdown()try connection.close();catch(IOException ex)error(“IO error closing socket”);200629292929第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类 public void error(String s)System.out.println(s);System.exit(1);200630303030第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类运行结果:C:javajdgch17java PortTalkApp 7Connected to at port 7.Destination host is .Destination IP address is 204.212.153.193.Destination port number is 7.Local host is .Local IP address is 204.212.153.194.Local port number is 1298.Send,receive,or quit(S/R/Q):200631313131第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类 PortTalkApp 连接到服务器204.212.153.193端口7。这是echo服务器应用程序的端口号。它用来测试主机之间的Internet通信。它识别主机名称、IP地址以及信宿端口号。200632323232第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类输人S以发送一行,然后在下一行输入This is a test!,如下所示:Send,receive,or quit(S/R/Q):SThis is a test!Send,receive,or quit(S/R/Q):200633333333第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.5 Socket 类 PortTalkApp将把该行发送到204.212.153.193主机的端口7,然后提示用户输入下一个命令。输入R以从服务器上接收一行:Send,receive,or quit(S/R/Q):r*This is a test!Send,receive,or quit(S/R/Q):200634343434第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类ServerSocket类实现了TCP服务器套接字。accept()方法用来引起服务器套接字监听并等待,直到建立了到达连接为止。一旦建立了连接,它就返回Socket类的一个对象。getInetAddress()方法返回套接字所连接的主机地址。getLocalPort()方法返回服务器套接字监听的端口。close()方法关闭服务器套接字。200635353535第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类import java.lang.System;import .ServerSocket;import .Socket;import java.io.IOException;import java.io.DataInputStream;import java.io.DataOutputStream;200636363636第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类public class ReverServerApp public static void main(String arg)try ServerSocket server=new serverSocket(1234);int localPort=sever.getLocalPort();System.out.println(“Reverse Server is listening on port“+localPort+”.”);Socket client=server.accept();String destName=client.getInetAddress().getHostName();int destPort=client.getPort();System.out.printin(“Accepted connection to“+destName+”on port”+destPort+”.”);200637373737第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类 DataInputStream inStream=new DataInputStream(client.getInputStream();DataOutputStream outStream=new DataOutputStream(client.getOutputStream();boolean finished=false;do String inline=inStream.readLine();System.out.println(“Received:“+inLine);if(inline.equalsIgnoreCase(“quit”)finished=true;String outline=new ReverseString(inline.trim().getString();200638383838第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类 for(int i=O;ioutline.lengthO;+i)outStream.write(byte)outLine.charAt(i);outStream.write(13);outStream.write(10);outStream.flush();System.out.println(“Sent:”+outLine);while(!finished);inStream.close();outStream.close();client.close();server.close();200639393939第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类 catch(IOException ex)System.out.println(“IOException occurred.”);200640404040第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类class ReverseStringString s;public ReverseString(String in)int len=in.length();char outChars=new charlen;for(int i=0;ijava ReverServerAppReverse Server is listening on port 1234.200642424242第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类在另一个窗口中按下面语句运行PortTalkApp C:javajdgch17java PortTalkApp 1234Connected to at port 1234.Destination host is .Destination IP address is 204.212.153.194.Destination port number is 1234.Local host is .Local IP address is 204.212.153.194.Local port number is 1302.Send,receive,or quit(S/R/Q):200643434343第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类 PortTalkApp显示了连接的两个端点的所有参数。如果查看ReverServerApp运行的窗口,将看到与下列消息相似的消息:Accepted connection to on port 1302.ReverServer报告的端口号与PortTalkApp所报告的一致。现在切换回PortTalkApp窗口,并输入S以发送一行文本,文本内容是”This is a test!”,Send,receive or quit(S/R/Q):SThis is a test!200644444444第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类ReverServerApp窗口报告如下:Received:This is a test!Send:!tset a si sihT在PortTalkApp窗口中输入R,输出如下所示:send,receive,or quit(S/R/Q):r*!tset a si sihTsend,receive,or quit(S/R/Q):200645454545第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类 PortTalkApp显示从ReverServerApp接收到的文本。输入S命令,后跟quit文本行:Send,reveive or quit(S/R/Q):Squitquit行被ReverServerApp读取,使它终止连接并退出。其显示如下:Received:quitsent:tiuqc:javajdgch17200646464646第第第第4 4章章章章 网络编程网络编程网络编程网络编程4.6 ServerSocket 类在PortTalkApp窗口中,输人Q以终止PortTalkApp,输出如下:Send,receive,or quit(S/R/Q):q c:javajdgch17200647474747第第第第4 4章章章章 网络编程网络编程网络编程网络编程本课小结 本课首先介绍了Internet的基础知识,包括IP协议、端口等概念。然后介绍了两种常见的通信方式:连接的通信与非连接的通信。接着,介绍了在Java环境下如何进行网络编程。连接方式的编程主要依靠TCP协议的支持,在程序中利用ServerSocket、Socket类进行编写。200648484848第第第第4 4章章章章 网络编程网络编程网络编程网络编程小测验1.简述IP地址的表示方式。2.简述使用Socket类进行网络连接需要那些步骤。200649494949第第第第4 4章章章章 网络编程网络编程网络编程网络编程小测验答案1.简述IP地址的表示方式。答:IP地址的表示方式主要有用十六进制数表示、用十进制数表示及域名表示三种。200650505050第第第第4 4章章章章 网络编程网络编程网络编程网络编程课后作业【作业作业1】实现实现Socket服务端,服务端,Socket客户端并建立其连接。客户端并建立其连接。200651515151