《java语言网络编程.ppt》由会员分享,可在线阅读,更多相关《java语言网络编程.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1Java网络编程2Java与网络nJava语言取得成功的领域之一就是网络n (其他语言)数页代码-(Java)一条语句nTCP/IP(传输控制协议/网间协议)是internet的主要协议,定义了计算机和外设进行通信所使用的规则(应用层,传输层,网络层,链路层).n大多数基于internet的应用程序被看作TCP/IP协议的上一层.如:ftp,http,smtp,pop3,telnet,nntp等nIP地址:TCP/IP网络中的每台计算机都有唯一的地址-IP地址.n在Java中,有一个用来存储internet地址的类叫InetAddress.3网络层次n4层网络结构:4传输层的两个基本协议n1
2、 TCP协议:确保以发送时的顺序接受,丢包重新传递,数据对于连接太快TCP会调整速度等n2UDP协议:允许接受方检测被破坏的包,不保证这些包正确的顺序传输。实时的音频或视频应用程序经常使用。如果UDP有纠错功能一般由应用层来实现,如TFTP等。UDP本身没有此功能5Java网络编程nJava的网络编程是建立在传输层之上的,我们可以创建自己的应用层协议。Java仅支持TCP和UDP。(ICMP不支持)nJava已经给我们提供好了基于传输层协议的类(Stream Socket和 Datagram Socket)nJava不能直接发IP数据包6TCP协议的实现nSocket是实现TCP协议的基本工具
3、,Socket对程序员掩盖了网络底层实现的细节。如:纠错,重传,网络地址等nSocket是网络上运行的程序之间双向通信链路的最后终结点nIP与端口的组合得出一个套接字,可以完全分辨internet上运行的程序7Socket概念n端口号:TCP/IP协议为每种服务定义了一个端口,当一台计算机上运行不同服务器程序时,根据端口号不同提供相应的服务.n端口号不是计算机上的物理连接器,它只是具有软件意义的假想端口internet服务服务端口号端口号端口号端口号internet服务服务telnet 23 nntp 119ftp 21 www 80DNS 53 POP3 1108Socket的功能n1连接远
4、程机器n2发送数据n3接受数据n4关闭连接n5绑定端口n6监听入站数据n7在所绑定得端口上接受来自远程的连接9Socket类nSocket类用代码通过主机操作系统的本地TCP栈进行通信。nSocket为用户提供的接口是流。10Socket类n ClientSocket(host,port#)Attempt the connectionOutputStreamInputStreamClose SocketServerServerSocket(port#)Server Socket.accept()Socket()OutputStreamInputStreamClose Socket11Socke
5、t类(续)n程序员只需把传输内容转化为流12客户端Socketn构造函数:npublic Socket(String host,int port)throws unknownHostException,IOExceptionnSocket socket=new Socket(“time.nist.gov”,80);n含义:n1 创建一个socket对象n2尝试连接主机主机名不存在或服务器没运行unknownHostException其他原因抛:IOException13客户端Socket(续)检查主机检查主机1024个端口哪些提供了个端口哪些提供了TCP服务服务public class Por
6、tsScannerString host=“localhost”;for(int i=1;i0)hostname=args0;try Socket socket=new Socket(hostName,13)InputStream timeStream=theSocket.getInputStream();StringBuffer time=new StringBuffer();int c;while(c=timeStream.read()!=-1)time.append(char)c);String timeString=time.toString().trim();System.out.p
7、rintln(timeString);catch(.).运行命令运行命令:java Daytime client time.nist.gov 运行结果:运行结果:Sun Oct 28 11:05:15 200716客户端Socket(续)nSocket使用之后要注意关掉.一般来说socket确实会在两个流的一个关闭后或在被垃圾回收时自动关闭。但是对于敏感的程序,在垃圾回收介入之前,系统会很快到达能打开的socket上限。尤其是跟很多硬件设备打交道的软件系统。17客户端Socket(续)try Socket connection=null;connection=new Socket(“time.
8、nist.gov”,13);/与与socket交互交互catch(UnknownHostException ex)System.err.println(ex);catch(IOException ex)System.err.println(ex);finally if(connection!=null)connection.close();18半关闭Socket close()方法同时关闭Socket的输入和输出n但JDK提供了shutdownInput()和shutdownOutput的方法19Socket异常nBindException没有权限使用Socket,想使用的端口被别的应用占用n
9、ConnectException主机忙或没有监听该端口的进程nNoRouteHostException表示连接超时nProtocolException表示网络接受的数据违反TCP/IP规范20ServerSocketn服务器Socket等待连接而客户端Socket发起连接。一旦ServerSocket建立起来连接,服务器就是用一个正常的Socket对客户端发送数据。21ServerSocket基本流程22ServerSocket的构造函数n构造函数:npublic ServerSocket(int port)throws BindException,IOExceptionnServerSock
10、et socket=new ServerSocket(80);n含义:创建一个server socket对象,服务的端口是80,如果port设为0或者null Java会随机选一个未占用的portn如果端口已经被其他应用程序占用抛出BindException23ServerSocket的构造函数(续)npublic ServerSocket(int port,int queueLength)throws BindException,IOExceptionnQueue表示入站连接请求队列的长度,这个长度必须小于操作系统所允许的最大长度npublic ServerSocket()throws IO
11、Exceptionn没有端口创建是没有意义的,因为客户端不知道如何连接过去nServerSocket ss=new ServerSocket();nSocketAddress http=new InetSocketAddress(80);nss.bind(http);24ServerSocket的监听方法naccept()监听客户端的连接。在未连接的时候accept()是阻塞的,他会停止执行流并等待25简单的日期时间服务器while(true)try Socket connection=null;connection=server.accept();Write out=new OutPutSt
12、reamWriter(connection.getOutputStream();Date now=new Date();out.write(now.toString()+”rn”);out.flush();connection.close();catch(UnknownHostException ex)System.err.println(ex);catch(IOException ex)System.err.println(ex);if(connection!=null)connection.close();finally26UDP的实现 UDP的实现类DatagramPacket和Data
13、gramSocket.nDatagramPacket的作用:将应用层的数据字节准变为UDP的传输单位datagram27UDP的实现(续)nDatagramSocket与TCP的Socket不同,nUDP没有连接的概念,没有TCP那样的服务器Socket和客户端Socket的概念。DatagramSocket既可以发又可以收,可以面对多个DatagramSocket进行收发,不像TCP协议中的1 on 1的关系,服务器没有必要创建Socket与客户端Socket通讯。28TCP通讯与UDP通讯对比29TCP通讯与UDP通讯对比30DatagramPacket类nDaragramPacket转化
14、成的Datagram已经与IP层的数据包非常接近,包含了目标地址n而TCP的数据片需要Socket告诉其目标地址,然后组成IP数据包。31DatagramPacket类n接受和发送数据包的构造函数是不同的:n1 接受数据包:public DatagramPacket(byte buffer,int length)两个参数1 byte buffer表示接受数据包的数组,length表示这个数组的长度。n2发送数据包:public DatagramPacket(byte data,int length,InetAddress destination,int port)除了包括接受的参数外还包括目标
15、地址和端口32DatagramPacket类(续)n创建一个DatagramPacket:String s=“This is a Test”;byte data=s.getBytes(“ASCII”);tryInetAddress ia=InetAddress.getByName(“”);int port=80DatagramPacket dp=new DatagramPacket(data,data.length,ia,port);catch(IOException e)33DatagramSocket类n与DatagramPacket类似发送与接受Socket只是构造函数不相同n发送Soc
16、ket对象nDatagramSocket client=new DatagramSocket()n由于发送无需关心发送端口所以操作系统会自动分配一个端口发送时服务器的端口已经写在了DatagramPacket中了n接受Socket对象nDatagramSocket server=new DatagramSocket(port)n由于需要监听客户端Socket所以必须指定port34DatagramSocket类(续)客户端程序例子:客户端程序例子:InetAddress server=InetAddress.getName(“”);BufferReader userInput=new Buff
17、erReader(new inputStreamReader(System.in);DatagramSocket theSocket=new DatagramSocket();while(true)String theLine=userInput.readLine();if(theLine.equals(“.”)break;byte data=theLine.getBytes(“UTF-8”);DatagramPacket theOutput=new DatagramPacket(data,data.length,server,port);theSocket.send(theOutput);3
18、5DatagramSocket类(续)服务器端程序例子:服务器端程序例子:DatagramSocket server=new DatagramSocket(port);DatagramPacket packet=new DatagramPacket(buffer,buffer.length);while(true)server.receive(packet);String s=new String(packet.getData(),0,packet.getLength(),”UTF-8”);System.out.println(s);packet.setLength(buffer.length
19、);36DatagramSocket类(续)nDatagramSocket的对象用完之后也是要关闭,如果等到垃圾回收关闭,有可能会造占满所有允许的Socket数。nTCP的Socket和UDP的Socket可以共用一个端口两种协议是毫不相干的且端口也只是个逻辑概念37组播Socketn与传统传播的区别:38组播的使用n采用MulticastSocket用法相近,但多了4个动作:n1加入组播组n2向组播组发送数据n3接受组播组的数据n4离开组播组39组播接受实例:服务器端程序例子:服务器端程序例子:MulticastSocket server=new MulticastSocket(port);
20、InetAddress ia=InetAddress.getByName(“224.2.2.2”);/定义组播组定义组播组Server.joinGroup(ia);byte buffer=new byte8192;DatagramPacket packet=new DatagramPacket(buffer,buffer.length);while(true)server.receive(packet);String s=new String(packet.getData(),0,packet.getLength(),”UTF-8”);System.out.println(s);40有用的工具
21、类InetAddress类nJava对于IP地址的高级表示。它包含了主机名和IP地址,我们知道了其中一个信息可以得到另一个信息。n3个构造函数:1 public static InetAddress getByName(String hostName)throws UnknownHostException2 public static InetAddress getAllByName(String hostName)throws UnknownHostException41InetAddress类(续)public static InetAddress getLocalhost(String
22、hostName)throws UnknownHostException通过DNS得到IP地址和hostname的转换42InetAddress类应用查找查找Microsoft所有的所有的IP地址:地址:public class AllAddressesOfMicroSoftpublic static void main(String args)tryInetAddress addresses=InetAddress.getAllByName(“”);for(int i=0;iaddresses.length;i+)System.out.println(addressesi);catch(UnknownHostException e)