资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,网络通信,Java,与,Internet,InetAddress,与,URL,Socket,通信,数据报通信,TCP/IP,网络参考模型包括五个层次:应用层、传输层、网络层、链路层、物理层。,大多数基于,Internet,的应用程序被看作,TCP/IP,网络的最上层,如:,ftp,,,http,,,smtp,,,pop3,,,telnet,等。,Java,与,Internet,网络基本概念,物理层,传输层,:,在,TCP/IP,网络中,不同的机器之间进行通信时,数据的传输是由传输层控制的,这包括数据要发往的目标机器及应用程序、数据的质量控制等。,TCP/IP,网络中最常用的传输协议就是,TCP,(,Transport Control Protocol,)和,UDP,(,User Datagram Protocol,)。,网络层,:,对,TCP/IP,网络中的硬件资源进行标识。连接到网络中的每台计算机(或其他设备)都有唯一的地址,这就是,IP,地址。,IP,地址实质上是一个,32,位的整数,通常以“,d.d.d.d,”,的形式表示,每个,d,是一个,8,位整数。,Java,与,Internet,网络基本概念,物理层,传输层中,两类传输协议,TCP(Transport Control Protocol),面向连接的能够提供,可靠的流式数据传输,的协议。类似于,打电话的过程,。,URL,Socket,ServerSocket,等类都使用,TCP,协议进行网络通讯。,UDP(User Datagram Protocol),非面向连接的提供,不可靠的数据包式的数据传输,的协议。类似于从,邮局发送信件,的过程。,DatagramPacket,DatagramSocket,等类使用,UDP,协议进行网络通讯。,注,:当对所传输的数据具有时序性和可靠性等要求时,应使用,TCP,协议;当传输的数据比较简单、对时序等无要求时,,UDP,协议能发挥更好的作用。,Java,与,Internet,网络基本概念,一台机器只通过一条链路连接到网络上,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就要靠网络端口号(,port,)了,。,端口号是一个标记机器的,逻辑通信信道的正整数,,端口号不是物理实体。,IP,地址和端口号组成了所谓的,Socket,,,Socket,是网络上运行的程序之间双向通信链路的最后终结点,。,网络服务,http,ftp,其他服务,23,telnet,端口,21,80,客户程序,Socket,IP,port,IP,与端口号组合而得出的,Socket,,,可以完全分辨,Internet,上运行的程序。,端口号是用一个,16,位的整数来表达的,其范围为,0,65535,,其中,0,1023,为系统所保留,专门给那些通用的服务(,well-known services,),如,http,服务的端口号为,80,,,telnet,服务的端口号为,21,,,ftp,服务的端口为,23,,,因此,当我们编写通信程序时,应选择一个大于,1023,的数作为端口号,以免发生冲突。,Java,与,Internet,端口号,Server,Client,Services,http(80),SMTP(25),ftp(21),telnet(23),Java,与,Internet,Java,中的网络支持,针对网络通信的不同层次,,Java,提供的网络功能有四大类:,InetAddress,、,URL,、,Socket,、,Datagram,。,InetAddress,面向的是,IP,层,用于标识网络上的硬件资源。,URL,面向的应用层,通过,URL,,,Java,程序可以直接送出或读入网络上的数据。,Socket,和,Datagram,面向的则是传输层。,Sockets,使用的是,TCP,协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信。,Datagram,则使用,UDP,协议,是另一种网络传输方式,它把,数据的目的地纪录在数据包中,,然后直接放在网络上。,类,InetAddress,可以用于标识网络上的硬件资源,它提供了一系列方法以描述、获取及使用网络资源。,InetAddress,类实例通常是用它提供的静态方法来获取:,public static,InetAddress,getByName(,String,host),host,可以是一个机器名,也可以是一个形如“,%d.%d.%d.%d”,的,IP,地址或一个,DNS,域名。,public static,InetAddress,getLocalHost,(),这两个方法通常会产生,UnknownHostException,例外,应在程序中捕获处理。,以下是,InetAddress,类的,几个主要方法:,public,String,getHostAddress,(),:,获得本对象的,IP,地址,“,%d.%d.%d.%d”,。,public,String,getHostName,(),:,获得本对象的机器名。,使用,InetAddress,测试,InetAddress,类,import,.InetAddress,;,public,class,InetAddressDemo,public,static,void,main(String,args,),throws,Exception,/,所有异常抛出,InetAddress,locAdd,=,null,;,/,声明,InetAddress,对象,InetAddress,remAdd,=,null,;,/,声明,InetAddress,对象,locAdd,=,InetAddress.,getLocalHost,();,/,得到本地,InetAddress,对象,remAdd,=,InetAddress.,getByName,(,);,/,取得远程,InetAddress,System.,out,.println,(,本机,IP,地址:,+,locAdd.getHostAddress,();,/,得到本地,IP,地址,System.,out,.println(,“google,的,IP,地址:,+,remAdd.getHostAddress,();,/,得到远程,IP,地址,Socket,通信,在,Java,中,基于,TCP,协议实现网络通信的类有两个:在客户端,的,Socket,类和在服务器端,的,ServerSocket,类。,在服务器端通过,指定一个用来等待的连接的端口号,创建一个,ServerSocket,实例。,在客户端通过规定一个主机和端口号创建一个,socket,实例,连到服务器上。,ServerSocket,类的,accept,方法使服务器处于阻塞状态,等待用户请求。,创建服务器,(,端口号,),定义数据成员,服务器等待,网络连接,建立,socket,流,发送谈话信息,接收用户谈话信息,创建,Socket,实例,定义数据成员,建立,socket,流,发送谈话信息,接收服务器谈话信息,关闭流,accept(),127.0.0.1 4444,4444,结束谈话,(Bye.),结束谈话,(Bye.),关闭流,服务器端,客户端,类,Socket,构造方法:,public Socket(,String,host,int,port),Socket,的输入,/,输出流管理,public,InputStream,getInputStream,(),public,OutputStream,getOutputStream,(),关闭,Socket,public void close()throws,IOException,注:上述方法都将抛出例外,IOException,,,程序中需要捕获处理。,类,ServerSocket,构造方法:,public,ServerSocket(int,port),主要方法,public,Socket,accept(),:,等待客户端的连接,public void close(),:,关闭,Socket,注:这些方法都将抛出例外,IOException,,,程序中需要捕获处理。,Socket,通信,无论一个,Socket,通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本步骤:,1,、在客户方和服务器方创建,Socket/,ServerSocket,。,2,、,打开连接到,Socket,的输入,/,输出流。,3,、,利用输入,/,输出流,按照一定的协议对,Socket,进行读,/,写操作。,4,、关闭输入,/,输出流和,Socket,。,通常,我们的主要工作是针对所要完成的功能在第,3,步进行编程,第,1,、,2,、,4,步对所有的通信程序来说几乎都是一样的。,Socket,通信,Server,ServerSocket(port,#),Socket socket=,ServerSocket.accept,(),接收连接,OutputStream,InputStream,Close Socket,Client,Socket(host,port#),与服务器建立连接,OutputStream,InputStream,Close Socket,socket,Server.java Client.java,Server1(1111),client(2222),Server2(2222),client(1111),Server,解决方案一:,在一台计算机上一次启动多个服务器程序,只要端口号不同。,myserver1 myclient1,myserver2myclient2,Socket,通信,支持多,Client,解决方案二:,将服务器写成多线程的,,不同的处理线程为不同的客户服务,。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。,/,主线程,while(true),accept a connection;,create a thread to deal with the client;,Socket,通信,支持多,Client,Server,client1,client2,serverthread2,serverthread1,Socket,通信,支持多,Client,serverSocket,=new ServerSocket(4444);,while(listening),Socket socket;,socket=,serverSocket.accept,();/,程序将在此等候客户端的连接,new,MultiTalkServerThread,(socket).start,();,serverSocket.close,();,class,MultiTalkServerThread,extends Thread,public,MultiTalkServerThread(Socket,socket),this.socket=socket;,public void run(),Socket,通信,支持多,Client,客户,1,客户,2,服务器,线程,1(),线程,2(),Computer_client.java,Computer_server.java,UDP,协议是无连接的协议,它以数据报作为数据传输的载体。,数据报是一个在网络上发送的独立信息,,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,,每个数据报的大小限定在,64KB,以内,。,UDP,协议无需在发送方和接收方建立连接。,数据报在网上可以以任何可能的路径传往目的地,。,在,Java,中,下面两个类是基于,UDP,协议实现网络通信的:,用于表达通信数据的数据报类,DatagramPacket,用于进行端到端通信的类,DatagramSocket,数据报通信,
展开阅读全文