《JSP课件-01Socket编程.ppt》由会员分享,可在线阅读,更多相关《JSP课件-01Socket编程.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、运行环境:运行环境:Office XP版版 本:本:ACCP 4.0课课 程:程:JSP作作 者:者:LuckyJSP序幕序幕-ISocket编程编程课程地位C#SQL ServerXMLPSPMASP.NETOracleOOADComputer BaseHTML/JavaScriptSQL BaseOOP/JavaCSTBJSP/ServletEJB/WebServiceWinFormsStruts/JSFTesting/SQALinux回顾Java课程Java语言的基本语法语言的基本语法OOP思想思想封装、继承和多态封装、继承和多态异常处理异常处理java.lang包、包、java.uti
2、l包、包、java.io包包JDBC数据库访问技术数据库访问技术Swing编程编程使用使用JBuilder 2005进行程序开发进行程序开发课程整体目标掌握网络通讯和线程的基本原理掌握网络通讯和线程的基本原理理解理解Web应用及开发的基本概念应用及开发的基本概念掌握掌握Servlet、会话管理、会话管理、Filter和和JavaMail掌握掌握JSP、JSP EL和和JSTL开发基于开发基于MVC模式的模式的Java Web应用程序应用程序本章相关词汇单单 词词说说 明明Internet Protocol(IP)互联网协议互联网协议net网络,网状物网络,网状物socket套接字,插座套接字,
3、插座server服务器,服务端服务器,服务端client客户,客户端客户,客户端port端口端口accept接收,认可接收,认可本章目标网络基础知识网络基础知识IP地址与端口地址与端口包包InetAddressSocketServerSocket扩展扩展IO流的相关知识流的相关知识计算机网络与通信通信是人类生活中最重要的需求之一;通信是人类生活中最重要的需求之一;通信是指:对语言、文字、声音和图片以及其它任通信是指:对语言、文字、声音和图片以及其它任何类型的相关数据进行传输;何类型的相关数据进行传输;计算机的出现以及网络的构成,使得数据通信更加计算机的出现以及网络的构成,使得数据通信更加快速有
4、效。快速有效。网络原理网络就是一组连接在一起的计算机。网络就是一组连接在一起的计算机。使用网卡、电缆、集使用网卡、电缆、集线器等连接设备连接线器等连接设备连接计算机以组成网络。计算机以组成网络。客户端/服务器模式网络发展,促使客户端网络发展,促使客户端/服务器模式应运而生;服务器模式应运而生;通过网络,向另一台计算机请求服务的计算机称为通过网络,向另一台计算机请求服务的计算机称为客户端,而处理请求的计算机称为服务器;客户端,而处理请求的计算机称为服务器;如数据服务器,需要数据的客户端机器向数据服务如数据服务器,需要数据的客户端机器向数据服务器提出请求,而服务器则处理客户端的请求并向其器提出请求
5、,而服务器则处理客户端的请求并向其发送所需的数据;发送所需的数据;客户端客户端/服务器的优势在于:服务器的优势在于:服务器和客户端分摊任务,分别负责部分处理工作;服务器和客户端分摊任务,分别负责部分处理工作;服务器可以同时为多台客户端服务;服务器可以同时为多台客户端服务;多个客户端可以同时访问服务器上的相同数据。多个客户端可以同时访问服务器上的相同数据。IP地址网络中有多台计算机,它们必须通过某种标识来区网络中有多台计算机,它们必须通过某种标识来区分每一台机器,这就是分每一台机器,这就是IP地址;地址;IP地址由地址由4个字节共个字节共32位二进制数组成,类似于:位二进制数组成,类似于:192
6、.168.0.8;在网络寻找某一台计算机都是依靠它的在网络寻找某一台计算机都是依靠它的IP地址(用地址(用域名或计算机名定位主机其实也是通过某种服务转域名或计算机名定位主机其实也是通过某种服务转成成IP地址后再找到该主机的);地址后再找到该主机的);网络网络ID:网络:网络ID标识了计算机或网络设备所在的网段;标识了计算机或网络设备所在的网段;主机主机ID:主机:主机ID标识了特定的主机或网络设备标识了特定的主机或网络设备特殊IP地址许多网络地址被保留用于特殊用途;许多网络地址被保留用于特殊用途;0.0.0.0和和127.0.0.1就是两个此类地址,第一个称为就是两个此类地址,第一个称为缺省路
7、由,后一个是环回地址;缺省路由,后一个是环回地址;127.0.0.1被保留用于用户主机的本地被保留用于用户主机的本地IP话务,它被话务,它被分配给一个特殊接口,即起到闭合电路作用的环回分配给一个特殊接口,即起到闭合电路作用的环回接口。接口。端口在一台物理性的计算机中,往往运行着多个网络程在一台物理性的计算机中,往往运行着多个网络程序,一个序,一个IP地址并不足以完整标识一个服务器,因地址并不足以完整标识一个服务器,因此,端口是机器内部独一无二的场所;此,端口是机器内部独一无二的场所;一台计算机上可能同时运行多个网络程序,一台计算机上可能同时运行多个网络程序,IP地址地址只能确保把数据送到指定的
8、计算机,但不能保证把只能确保把数据送到指定的计算机,但不能保证把这些数据传递给哪个网络程序;这些数据传递给哪个网络程序;端口使用一个端口使用一个16位的数字来表示,它的范围是位的数字来表示,它的范围是065535,1024以下的端口号保留给预定义的服务,以下的端口号保留给预定义的服务,如:如:http使用使用80端口;端口;网络间通信其实是在网络应用程序端口之间进行的。网络间通信其实是在网络应用程序端口之间进行的。包使用使用包可以实现包可以实现Java的网络功能,的网络功能,其中包含了一系列与网络通讯相关的类,比其中包含了一系列与网络通讯相关的类,比较重要的有:较重要的有:InetAddres
9、sSocketServerSocket如果要进行网络通讯编程的话,必须导入此如果要进行网络通讯编程的话,必须导入此包。包。.InetAddressInetAddress用来表示互联网协议(用来表示互联网协议(IP)地址,它的实例将)地址,它的实例将IP地址和地址和DNS(主机名解析)进行了封装;(主机名解析)进行了封装;该类无法直接实例化,只能通过下列静态工厂方法获得实例:该类无法直接实例化,只能通过下列静态工厂方法获得实例:方方 法法 原原 型型说说 明明static InetAddress getByName(String host)throws UnknownHostException在
10、给定主机名的情况下确定主机的在给定主机名的情况下确定主机的 IP 地址地址static InetAddress getLocalHost()throws UnknownHostException返回本地主机的返回本地主机的InetAddress对象对象static InetAddress getByAddress(byte address)throws UnknownHostException在给定原始在给定原始 IP 地址的情况下,返回地址的情况下,返回 InetAddress 对象对象static InetAddress getAllByName(String host)throws Un
11、knownHostException在给定主机名的情况下,根据系统上配置的在给定主机名的情况下,根据系统上配置的名称服务返回其名称服务返回其 IP 地址所组成的数组地址所组成的数组InetAddress示例import .*;/导入导入包包public class InetAddressDemo public static void main(String args)try /获得当前本地主机的获得当前本地主机的IP地址地址 InetAddress add1=InetAddress.getLocalHost();System.out.println(当前本地主机:当前本地主机:+add1);/
12、根据域名,通过根据域名,通过DNS域名解析,获得相应服务的主机地址域名解析,获得相应服务的主机地址 InetAddress add2=InetAddress.getByName();System.out.println(网易服务器主机:网易服务器主机:+add2);/根据字符串表现形式的根据字符串表现形式的IP地址获得相应的主机地址地址获得相应的主机地址(若果网络上有该若果网络上有该IP地址的话地址的话)InetAddress add3=InetAddress.getByName(192.168.0.22);System.out.println(IP地址为地址为192.168.0.22的主机:
13、的主机:+add3);/根据机器名获得相应的主机地址(如果网络上有该机器名的话)根据机器名获得相应的主机地址(如果网络上有该机器名的话)InetAddress add4=InetAddress.getByName(J104);System.out.println(机器名为机器名为J104的主机:的主机:+add4);catch(UnknownHostException uhe)uhe.printStackTrace();InetAddress的其它方法方方 法法 原原 型型说说 明明byte getAddress()返回此返回此 InetAddress 对象的原始对象的原始 IP 地址地址St
14、ring getHostAddress()返回此返回此 InetAddress 对象的对象的IP地址字符串地址字符串String getHostName()返回此返回此 InetAddress 对象的主机名称对象的主机名称boolean equals(Object other)判断两个判断两个IP地址是否相等地址是否相等String toString()返回此返回此 InetAddress 对象的字符串表现形式(主对象的字符串表现形式(主机名机名/IP地址)地址)套接字网络上计算机通过网络上计算机通过TCP/IP协议进行通信,而套接协议进行通信,而套接字(字(socket)则将这些通信协议进行
15、了封装;)则将这些通信协议进行了封装;TCP/IP套接字用于在主机和套接字用于在主机和Internet之间建立可靠之间建立可靠的、双向的、持续的、点对点的流式连接;的、双向的、持续的、点对点的流式连接;socket用于描述用于描述IP地址和端口,应用程序通过套接地址和端口,应用程序通过套接字向网络发出请求或者应答网络请求;字向网络发出请求或者应答网络请求;也就是说,套接字起到通信端点的作用;也就是说,套接字起到通信端点的作用;客户端和服务器通过套接字建立连接和通信。客户端和服务器通过套接字建立连接和通信。主机甲主机甲套接字通信原理A程序程序主机乙主机乙B程序程序TCP/IP协议协议网网 卡卡网
16、络管理软件网络管理软件socketsocket主机甲上的主机甲上的A程程序将一段数据写序将一段数据写入入socket中中 主机乙上的主机乙上的B程程序从序从socket中读中读取这段数据取这段数据 .SocketSocket类用于创建套接字对象,其构造方法共有类用于创建套接字对象,其构造方法共有9种重载,常用的有如下几种:种重载,常用的有如下几种:套接字会因为网络的连接中断而失效,所以对它的套接字会因为网络的连接中断而失效,所以对它的操作都有可能抛出操作都有可能抛出IOException构构 造造 方方 法法说说 明明Socket(InetAddress address,int port)th
17、rows IOException用预先存在的用预先存在的InetAddress对象和端口创建一对象和端口创建一个与本地主机连接的套接字个与本地主机连接的套接字Socket(String hostName,int port)throws UnknownHostException,IOException创建一个本地主机与给定名称的主机和端口创建一个本地主机与给定名称的主机和端口连接的套接字连接的套接字Socket的常用方法一旦一旦Socket对象被成功创建,就可以获得访问与之对象被成功创建,就可以获得访问与之相关的输入相关的输入/输出流的权力,通过流操作从套接字输出流的权力,通过流操作从套接字中发
18、送(输出)和接收(输入)数据:中发送(输出)和接收(输入)数据:方方 法法 原原 型型说说 明明InputStream getInputStream()throws IOException获得当前套接字的输入流获得当前套接字的输入流OutputStream getOutputStream()throws IOException获得当前套接字的输出流获得当前套接字的输出流void close()throws IOException关闭当前套接字关闭当前套接字Socket的其它方法使用下面的方法,可以在任何时候检查套接字的地使用下面的方法,可以在任何时候检查套接字的地址和与之相关的端口信息:址和与
19、之相关的端口信息:方方 法法 原原 型型说说 明明InetAddress getInetAddress()返回与当前套接字连接的远程主机的返回与当前套接字连接的远程主机的InetAddress对象,如果未连接,则返回对象,如果未连接,则返回nullint getPort()返回与当前套接字连接的远程主机端口返回与当前套接字连接的远程主机端口InetAddress getLocalAddress()返回与当前套接字绑定的本地主机的返回与当前套接字绑定的本地主机的InetAddress对象对象int getLocalPort()返回与当前套接字绑定的本地主机端口返回与当前套接字绑定的本地主机端口.
20、ServerSocketServerSocket类用来创建服务器套接字,它监听本地或远程类用来创建服务器套接字,它监听本地或远程客户程序通过公共端口的连接;客户程序通过公共端口的连接;ServerSocket类有类有4个重载的构造方法,以下是常用的:个重载的构造方法,以下是常用的:ServerSocket的常用方法如下:的常用方法如下:构构 造造 方方 法法说说 明明ServerSocket(int port)throws IOException创建服务套接字,它负责侦听由创建服务套接字,它负责侦听由port指定的端口指定的端口方方 法法 原原 型型说说 明明Socket accept()th
21、rows IOException等待并侦听来自客户端的请求,一旦接收到,返回等待并侦听来自客户端的请求,一旦接收到,返回一个与客户进行通信的一个与客户进行通信的Socketvoid close()throws IOException关闭当前服务器套接字关闭当前服务器套接字Socket编程编写服务器端程序:编写服务器端程序:创建一个服务器套接字(创建一个服务器套接字(ServerSocket),绑定到指定端口;),绑定到指定端口;调用调用accept方法,侦听来自客户端的请求,如果客户发出请求,则方法,侦听来自客户端的请求,如果客户发出请求,则接受连接,返回通信套接字(接受连接,返回通信套接字(
22、Socket););调用调用Socket的的getInputStream和和getOutputStream方法,获得输入方法,获得输入/输出流,开始网络数据的接收和发送;输出流,开始网络数据的接收和发送;关闭通信套接字,关闭服务器套接字。关闭通信套接字,关闭服务器套接字。编写客户端程序:编写客户端程序:创建一个套接字(创建一个套接字(Socket),向服务器的侦听端口发出请求;,向服务器的侦听端口发出请求;与服务器正确连接后,调用与服务器正确连接后,调用Socket的的getInputStream和和getOutputStream方法,获得输入方法,获得输入/输出流,开始网络数据的接收和输出流
23、,开始网络数据的接收和发送;发送;关闭通信套接字。关闭通信套接字。ClientServerSocket编程示意图ServerSocket(int port)InputStream getInputStream()OutputStream getOutputStream()close()close()InputStream getInputStream()OutputStream getOutputStream()Socket(InetAddress address,int port)Socket accept()示例(服务端)public class Server private static
24、 final int SERVER_PORT=9001;/指定侦听端口指定侦听端口 public Server()try ServerSocket ss=new ServerSocket(SERVER_PORT);/创建服务器套接字创建服务器套接字 System.out.println(服务端已启动,正在等待客户端服务端已启动,正在等待客户端.);Socket s=ss.accept();/侦听来自客户端的请求侦听来自客户端的请求 InputStream in=s.getInputStream();/获得输入流,用来接收数据获得输入流,用来接收数据 OutputStream out=s.get
25、OutputStream();/获得输出流,用来发送数据获得输出流,用来发送数据 byte buf=new byte1024;int len=in.read(buf);/从输入流中读取数据从输入流中读取数据 String strFromClient=new String(buf,0,len);System.out.print(来自客户端的信息来自客户端的信息);System.out.println(strFromClient);String strToClient=我也很好!我也很好!;out.write(strToClient.getBytes();/往输出流中发送数据往输出流中发送数据 i
26、n.close();out.close();/关闭输入流和输出流关闭输入流和输出流 s.close();ss.close();/关闭通信套接字和服务器套接字关闭通信套接字和服务器套接字 System.out.println(服务端已关闭。服务端已关闭。);catch(IOException ioe)ioe.printStackTrace();public static void main(String args)new Server();示例(客户端)public class Client private static final int SERVER_PORT=9001;/服务器的侦听端口服
27、务器的侦听端口 public Client()try /由于服务端也是运行在本机,所以创建本机的由于服务端也是运行在本机,所以创建本机的InetAddress对象对象 InetAddress address=InetAddress.getByName(localhost);Socket s=new Socket(address,SERVER_PORT);/向服务器侦听端口发出请求向服务器侦听端口发出请求 System.out.println(客户端已启动。客户端已启动。);InputStream in=s.getInputStream();/获得输入流,用来接收数据获得输入流,用来接收数据 O
28、utputStream out=s.getOutputStream();/获得输出流,用来发送数据获得输出流,用来发送数据 String strToServer=你好!你好!;out.write(strToServer.getBytes();/往输出流中发送数据往输出流中发送数据 byte buf=new byte1024;int len=in.read(buf);/从输入流中读取数据从输入流中读取数据 String strFromServer=new String(buf,0,len);System.out.print(来自服务端的回答来自服务端的回答);System.out.println
29、(strFromServer);in.close();out.close();/关闭输入流和输出流关闭输入流和输出流 s.close();/关闭通信套接字关闭通信套接字 System.out.println(客户端已关闭。客户端已关闭。);catch(UnknownHostException nhe)System.out.println(未找到指定主机未找到指定主机.);catch(IOException ioe)ioe.printStackTrace();public static void main(String args)new Client();关于IO流计算机系统将除了计算机系统将除
30、了CPU和内存以外其它所有设备都当成文和内存以外其它所有设备都当成文件来处理,包括网络终端(网卡)也不例外;件来处理,包括网络终端(网卡)也不例外;在两台主机之间通过在两台主机之间通过socket建立握手连接之后,主要是通过建立握手连接之后,主要是通过输入输入/输出流来接收和发送数据,实际上,对于网络的操作,输出流来接收和发送数据,实际上,对于网络的操作,绝大部分是在操作绝大部分是在操作IO流;流;实际上操作网络端口流与操作磁盘文件流的原理是相似的;实际上操作网络端口流与操作磁盘文件流的原理是相似的;出于效率的考虑,出于效率的考虑,socket使用的是字节流,但是在实际操作使用的是字节流,但是
31、在实际操作中,字节往往会带来不便,所以我们一般会把字节流改造中,字节往往会带来不便,所以我们一般会把字节流改造成字符流后进行操作。成字符流后进行操作。输入对于对于InputStream,先使用,先使用InputStreamReader转转化成字符流;化成字符流;然后再使用然后再使用BufferedReader建立缓冲,以提高效率,建立缓冲,以提高效率,如:如:InputStream is=socket.getInputStream();InputStreamReader isr=new InputStreamReader(is);BufferedReader in=new BufferedRe
32、ader(isr);java.io.PrintWriterPrintWriter是字符输出流,它提供格式化的输出功能,由是字符输出流,它提供格式化的输出功能,由于构造方法的支持,允许将字节流转化成字符流的形式;于构造方法的支持,允许将字节流转化成字符流的形式;它的构造方法共有它的构造方法共有8种重载,以下是常用的几种:种重载,以下是常用的几种:构构 造造 方方 法法说说 明明PrintWriter(OutputStream out)利用现有的利用现有的OutputStream构造格式打印流,但不带自动构造格式打印流,但不带自动刷新缓存的功能刷新缓存的功能PrintWriter(OutputSt
33、ream out,boolean autoFlush)利用现有的利用现有的OutputStream构造格式打印流,由参数构造格式打印流,由参数autoFlush指定是否带自动刷新缓存的功能指定是否带自动刷新缓存的功能PrintWriter(Writer out)利用现有的利用现有的Writer构造格式打印流,但不带自动刷新缓构造格式打印流,但不带自动刷新缓存的功能存的功能PrintWriter(Writer out,boolean autoFlust)利用现有的利用现有的Writer构造格式打印流,由参数构造格式打印流,由参数autoFlush指指定是否带自动刷新缓存的功能定是否带自动刷新缓存
34、的功能PrintWriter(File file)throws FileNotFoundException针对由针对由file指定的文件对象,创建格式打印流,但不带自指定的文件对象,创建格式打印流,但不带自动刷新缓存的功能动刷新缓存的功能PrintWriter的常用方法方方 法法 原原 型型说说 明明void print(X x)该方法提供该方法提供8种重载,可以输出任意数据类型,但输出种重载,可以输出任意数据类型,但输出时不带换行效果,因此,也不会自动刷新缓存时不带换行效果,因此,也不会自动刷新缓存void println(X x)该方法提供该方法提供10种重载,可以输出任意数据类型,有换行
35、种重载,可以输出任意数据类型,有换行效果,如果构造方法设置为自动刷新的话,该方法的自效果,如果构造方法设置为自动刷新的话,该方法的自动刷新功能将生效动刷新功能将生效void flush()刷新缓存区刷新缓存区void close()关闭流关闭流附录:IO流的继承体系OutputStreamFileOutputStreamPipedOutputStream字节输出流字节输出流FilterOutputStreamByteArrayOutputStreamDataOutputStreamPrintStreamBufferedOutputStream改写示例(代码片段)public class Cli
36、ent /改用字符流的方式收发网络数据改用字符流的方式收发网络数据 Socket s=new Socket(address,SERVER_PORT);InputStream is=s.getInputStream();InputStreamReader isr=new InputStreamReader(is);BufferedReader in=new BufferedReader(isr);OutputStream os=s.getOutputStream();PrintWriter out=new PrintWriter(os,true);out.println(strToServer)
37、;String strFromServer=in.readLine();out.close();in.close();完整代码请参见完整代码请参见随课件一起提供随课件一起提供的源文件的源文件总结网络的发展促使计算机之间的通信日趋重要;网络的发展促使计算机之间的通信日趋重要;网络上的计算机通过网络上的计算机通过IP地址来区分不同的机器,端地址来区分不同的机器,端口是数据的通道,使得多个应用程序在同一主机上口是数据的通道,使得多个应用程序在同一主机上进行网络通信;进行网络通信;InetAddress用来描述主机地址;用来描述主机地址;Socket用来创建两台主机之间的连接;用来创建两台主机之间的连
38、接;ServerSocket用来侦听来自客户端的请求;用来侦听来自客户端的请求;我们实际上是通过操作我们实际上是通过操作IO流来进行数据的收发工流来进行数据的收发工作,将字节流改造成字符流会使操作更加方便。作,将字节流改造成字符流会使操作更加方便。附录:IO流的继承体系InputStreamFileInputStreamStringBufferInputStreamFilterInputStreamDataInputStreamBufferedInputStreamPipedInputStreamSequenceInputStreamLineNumberInputStreamPushbackInputStream字节输入流字节输入流附录:IO流的继承体系ReaderBufferedReader字符输入流字符输入流CharArrayReaderPipedReaderStringReaderLineNumberReaderFilterReaderInputStreamReaderFileReaderPushbackReader附录:IO流的继承体系WriterBufferedWriter字符输出流字符输出流CharArrayWriterStringWriterPipedWriterPrintWriterOutputStreamWriterFileWriter