TP14-网络通信

上传人:ll****x 文档编号:243158090 上传时间:2024-09-17 格式:PPT 页数:59 大小:512KB
返回 下载 相关 举报
TP14-网络通信_第1页
第1页 / 共59页
TP14-网络通信_第2页
第2页 / 共59页
TP14-网络通信_第3页
第3页 / 共59页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Java,程序设计之网络编程,电子邮件:,教学课件,1,第,15,章,网络通信,2,主要内容,15.1,网络通信简介,15.2,URL,通信,15.3,Socket,通信,15.,4 Datagram,通信,15.,5,远程方法调用,(,RMI),15.1,网络通信简介,网络通信的核心是协议。协议是指进程之间交换信息已完成任务所使用的一系列规则和规范。它主要包含两个方面的定义:,1,定义了进程之间交换消息所必需遵循的顺序。,2,定义进程之间所交换的消息的格式。,通过定义协议,可以看出,两个进程只要遵循相同的协议,就可以相互交换信息,而这两个进程可以用不同的编程语言编写,可以位于两个完全不同的计算机上。国际标准化组织给出了一个通用的参考协议,称为开放式系统互连参考模型,(,ISO/OSI RM),。,15.1,网络通信简介,开放式系统互连参考模型,Java,提供的网络功能有三大类,: URL, Socket, Datagram.,1,),URL,是三大功能中最高级的一种,通过,URL Java,程序可以直接送出或读入网络上的数据,.,2,),Socket,是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道,.(,传输层接口,),3) Datagram,是更低级的网络传输方式,它把数据的目的纪录在数据包中,然后直接放在网络上,.,两类传输协议:TCP;UDP尽管TCP/IP协议的名称中只有TCP这个协议名,但是在TCP/IP的传输层同时存在TCP和UDP两个协议。,TCP与UDP,TCP,是,Tranfer Control Protocol,的简称,是一种面向连接的保证可靠传输的协议。通过,TCP,协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个,socket,之间必须建立连接,以便在,TCP,协议的基础上进行通信,当一个,socket,(通常都是,server socket,)等待建立连接时,另一个,socket,可以要求进行连接,一旦这两个,socket,连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。,UDP,是,User Datagram Protocol,的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。,下面我们对这两种协议做简单比较:使用,UDP,时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。对于,TCP,协议,由于它是一个面向连接的协议,在,socket,之间进行数据传输之前必然要建立连接,所以在,TCP,中多了一个连接建立的时间。使用,UDP,传输数据时是有大小限制的,每个被传输的数据报必须限定在,64KB,之内。而,TCP,没有这方面的限制,一旦连接建立起来,双方的,socket,就可以按统一的格式传输大量的数据。,UDP,是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。而,TCP,是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。,TCP,在网络通信上有极强的生命力,例如远程连接(,Telnet,)和文件传输(,FTP,)都需要不定长度的数据被可靠地传输。相比之下,UDP,操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中,client/server,应用程序。,为什么还要非可靠传输的,UDP,协议呢?主要的原因有两个。一是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此,TCP,传输的效率不如,UDP,高。二是在许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用,UDP,会更合理一些。,15.2,URL,通信,15.2.1,URL,简介,15.2.2,URL,类,15.2.3,通过字节流访问,WWW,资源,15.2.4,通过,URLConnection,实现双向通信,URL(Uniform Resource Locater),是统一资源定位器的简称, URL,的值表示网络上某个资源,(,如打印机、文件,),的地址,因此只要按,URL,规则定义某个资源,那么网络上的其他程序就可以通过,URL,来访问它,URL,用来网络资源定位,它的值由,5,部分组成,格式如下,:,:/:/,15.2.1,URL,简介,其中传输协议(,protocol,),指明获取资源所使用的传输协议,如,http,、,ftp,、,file,等。主机名(,hostname,),指定资源所在的计算机,可以是,IP,地址,如,127.0.0.1,,也可以是主机名或域名,如,。,一个计算机中可能有多种服务(应用程序),端口号(,port,),用来区分不同的网络服务,如,http,服务的默认端口号是,80,,,ftp,服务的默认端口号是,21,等。文件名(,),包括该文件的完整路径。在,http,协议中,缺省的文件名是,index.html,,,因此,,15.2.1,URL,简介,就相等同于,。,引用(,reference,),为资源内的某个引用,用来定位显示文件内容的位置,如,。,但并非所有的,URL,都包含这些元素。对于多数的协议,主机名和文件名是必需的,但端口号和文件内部的引用则是可选的,。,15.2.2 URL类,java,中定义了,URL,类。,URL,类有六个构造函数,其中最常用的有以下四种,:,1) URL(Stringspec),例:,URL u=new URL(“”);,2,),URL(Stringprotocol, Stringhost, Stringfile),3,),URL(Stringprotocol, Stringhost, intport, Stringfile),上两种方法将一个,URL,地址分解,按不同部分分别指定协议、主机、,端口、文件。例如:,URL u=new URL(“http”, ”,80, “docs/books/tutorial.intro.html”);,4,),URL(URLcontext, Stringspec),URL u=new URL(“”);,URL u1=new URL(u, ”tutorial.intro.html”);,URL u2=new URL(u, ”tutorial.super.html”);,15.2.3,通过字节流访问,WWW,资源,URL,对象创建后,就可以通过它来访问指定的,WWW,资源。这时需要调用,URL,类的,openStream(),方法,该方法与指定的,URL,建立连接并返回一个,InputStream,类的对象,这样访问网络资源的操作就变成了我们熟悉的,I/O,操作,接下来就可以用字节流的方式读取资源数据。,15.2.3,通过字节流访问,WWW,资源,import java.io.*;,import .*;,public class URL2public static void main (String args) throws IOException,URL url = new URL (“”);,InputStreamReader isr = new InputStreamReader,(url.openStream ();,BufferedReader br=new BufferedReader(isr);,String s;while (s = br.readLine () != null) System.out.print (s);br.close ();,JDK5.0 .URL类,15.2.4,URLConnection,实现双向通信,实际应用中,只能读取数据是不够的,很多情况下,我们都需要将一些信息发送到服务器中去,这就要求我们能够实现同网络资源的双向通信,,URLConnection,类就是用来解决这一问题的。,类,URLConnection,也是定义在包,里,它表示,Java,程序和,URL,在网络上的通信连接。当与一个,URL,建立连接时,首先要在一个,URL,对象上通过方法,openConnection,(),生成对应的,URLConnection,对象。,URLConnection,是以,HTTP,协议为中心的类,其中很多方法只有在处理,HTTP,的,URL,时才起作用。,抽象类,URLConnection,是所有类的超类,它代表应用程序和,URL,之间的通信链接。此类的实例可用于读取和写入此,URL,引用的资源。通常,创建一个到,URL,的连接需要几个步骤:,1),通过在,URL,上调用,openConnection,方法创建连接对象。,2),操作设置参数和一般请求属性。,3),使用,connect,方法建立到远程对象的实际连接。,4),远程对象变为可用。远程对象的头字段和内容变为可访问。,1.建立连接,URL url=new URL(“”);,URLConnection con=url.openConnection();,2.,向服务器端送数据,PrintStream ps=,new PrintStream(con.getOutputStream();,ps.println(string_data);,3.,从服务器读数据,DataInputStream dis=,new DataInputStream(con.getInputStream();,dis.readLine();,使用URLConnection的例子,/ComWithCgi.java,import java.io.*;,import .*;,public class ComWithCgi,public static void main(String args) throws Exception,URL url = new URL(http:/ connection = url.openConnection();,connection.setDoOutput(true);,PrintStream ps =,new PrintStream(connection.getOutputStream();,ps.println(0123456789);,ps.close(); /,向服务器输出数据,DataInputStream dis =,new DataInputStream(connection. getInputStream();,String inputLine;,while (inputLine = dis.readLine() != null) ,System.out.println(inputLine); ,dis.close();/,从服务器读数据,socket,是指在一个特定编程模型下,进程间通信链路的端点。因为这个特定编程模型的流行,,socket,这个名字在其他领域得到了复用,包括,Java,技术。,当进程通过网络进行通信时,,Java,技术使用它的流模型。一个,socket,包括两个流:一个输入流和一个输出流。如果一个进程要通过网络向另一个进程发送数据,只需简单地写入与,socket,相关联的输出流。一个进程通过从与,socket,相关联的输入流读来读取另一个进程所写的数据。,建立网络连接之后,使用与,socket,相关联的流和使用其他流是非常相似的。,10.3 Socket,Socket的概念,如果要建立连接,一台机器必须,运行一个进程来等待连接,,而另一台机器必须试图到达第一台机器。这和电话系统类似;一方必须发起呼叫,而另一方在此时必须等待电话呼叫。,你发起电话呼叫时,你必须知道所拨的电话号码。如果要发起网络连接,你需要知道远程机器的地址或名字。此外,每个网络连接需要一个端口号,你可以把它想象成电话的分机号码。一旦你和一台计算机建立连接,你需要指明连接的目的。所以,就如同你可以使用一个特定的分机号码来和财务部门对话那样,你可以使用一个特定的端口号来和会计程序通信。,cmd,netstat na,可以查看本机的端口使用情况。,TCP/IP,系统中的端口号是一个,16,位的数字,它的范围是,065535,。实际上,小于,1024,的端口号保留给预定义的服务,而且除非要和那些服务之一进行通信,(,例如,telnet,,,SMTP,邮件和,ftp,等,),,否则你不应该使用它们。,10.3 Socket,Socket是网络上运行的程序之间双向通信链路的最后终结点,网络服务,Mail,ftp,finger,20,telnet,数据结构,I/O,缓冲区,端口,21,23,客户程序,Socket,IP,port,IP,与端口的组合得出一个套接字,可以完全分辨,Internet,上运行的程序,internet,服务,端口号,端口号,internet,服务,telnet 23 nntp 119,ftp 21 www 80,DNS 53 POP3 110,10.3 Socket,端口号,:TCP/IP,协议为每种服务定义了一个端口,当一台计算机上运行不同服务器程序时,根据端口号不同提供相应的服务,.,端口号不是计算机上的物理连接器,它只是具有软件意义的假想端口,Cmd-Netstat na,命令可以查询端口情况,10.3 Socket,在服务器端通过指定一个用来等待的连接的端口号创建一个 ServerSocket实例.,在客户端通过规定一个主机和端口号创建一个 socket实例,连到服务器上.,ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求,Socket类和ServerSocket是基于TCP协议的.,10.3 Socket,在本地机器上测试网络程序用回送地址Socket socket=new Socket(“127.0.0.1”,2525);,如果网络的一端已经关闭,另一端读到null.,建立socket连接后,还应该建立输入输出数据流.,10.3 Socket,Server,ServerSocket(port #),Server Socket.accept(),Socket(),OutputStream,InputStream,Close Socket,Client,Socket(host, port #),Attempt the connection,OutputStream,InputStream,Close Socket,10.3 Socket,下面的例子演示一个简单的服务器与客户的交互,即服务器等待,客户访问,相互通一次信息.,10.5 Socket,. 10.5 Socket,创建服务器,(,端口号,),定义数据成员,服务器等待,网络连接,建立,socket,流,读客户 端信息,向用户发出一个字符串,创建,Socket,实例,定义数据成员,建立,socket,流,读,socket,流,(,接收并显示,),送用户名给,服务器,关闭流,waiting for user,127.0.0.1 1111,1111,login:,connetcting client.,java,提示用户登录成功,读,socket,流,User :java,Login successful,10.5 Socket,例:显示服务器与客户机间的通信(服务器端),PrintStream ps=null;,DataInputStream dis=null;,String username;,ServerSocket serverSocket=null;,Socket clientSocket=null;,try ,serverSocket=new,ServerSocket(1111);,catch (IOException e), System.out.println( “Error”+e);,System.exit(1);,try clientSocket=serverSocket.accept();,catch (IOException e),System.out.println(Accept failed.);System.exit(1);,创建服务器,(,端口号,),定义数据成员,服务器等待,网络连接,10.3 Socket,.,ps=new PrintStream(clientSocket.getOutputStream();,dis=new,DataInputStream(clientSocket.getInputStream();,创建服务器,(,端口号,),定义数据成员,服务器等待,网络连接,建立,socket,流,向客户发出登录要求,ps.println(login:); ps.flush();,10.3 Socket,ps.println(login sucessful); ps.flush();,System.out.println(username+ has logged off);,读客户 端信息,创建服务器,(,端口号,),定义数据成员,服务器等待,网络连接,建立,socket,流,向用户发出登录要求,通知客户连接完毕,if (,username=dis.readLine()=null,),System.out.println(readLine returned null);,System.exit(1); ,System.out.println(Username:+username);,10.3 Socket,显示服务器与客户机间的通信,(,客户端,),例:,创建,Socket,实例,PrintStream output;,DataInputStream input;,String string;,Socket socket=null;,定义数据成员,trysocket=new Socket(127.0.0.1,1111);,catch(IOException e),System.out.println(Error ”+e); return;,input=new DataInputStream(socket.getInputStream();,output=new PrintStream(socket.getOutputStream();,建立,socket,流,. 10.3 Socket,.,System.out.println(input.readLine();,创建,Socket,实例,定义数据成员,建立,socket,流,读,socket,流,(,看到提示,),System.in.read(bArray);,String s=new String(bArray,0);,output.println(s);,从键盘上读送用户,名送给服务器端,关闭流,socket.close();,input.close();,output.close();,System.out.println(Done);,System.out.println(input.readLine();,System.out.print(Logging off.);,读服务器反馈,. 10.5 Socket,. 10.5 Socket,创建服务器,(,端口号,),定义数据成员,服务器等待,网络连接,建立,socket,流,读客户 端信息,向用户发送字符串,创建,Socket,实例,定义数据成员,建立,socket,流,读,socket,流,(,看到提示,),送用户名给,服务器,关闭流,waiting for user,127.0.0.1 1111,1111,login:,connetcting client.,java,提示用户登录成功,读,socket,流,User :java,Login successful,10.3 Socket,支持多客户,一种解决方案:,一台计算机上一次启动多个服务器程序,只要端口号不同,如下:,myserver myclient-f1.bat,myserver2myclient2-f2.bat,Server1(1111),client(2222),Server2(2222),client(1111),Computer 1,10.3 Socket,第二种方案:,(支持多客户),Server,client1,client2,serverthread,serverthread,将服务器写成多线程的,不同的线程为不同的客户服务,.,main(),只负责循环等待,线程负责网络连接,接收客户输入的信息,10.3 Socket,.,客户,1,客户,2,服务器,线程,(),线程,2,线程,( ),线程,( ),进程,. 10.3 Socket,创建服务器,(,端口号,),定义数据成员,服务器等待,网络连接,建立,socket,流,读客户 端信息,提示用户输入客户名,创建,Socket,实例,定义数据成员,建立,socket,流,读,socket,流,(,看到提示,),送用户名给,服务器,关闭流,waiting for user,127.0.0.1 1111,1111,login:,connetcting client.,java,提示用户登录成功,读,socket,流,User :java,Login successful,10.5 Socket,public static void main(String args),ServerSocket serverSocket=null;,tryserverSocket=new ServerSocket(1111);,catch(Exception e),System.out.println(”Error”+e);System.exit(1);,while(true),Socket clientSocket=null;,System.out.println(waiting for users.);,try,clientSocket=serverSocket.accept();,catch(IOException e),System.out.println(accept failed:+e);,new serverThread(,clientSocket,).start();, / while,10.5 Socket,class serverThread extends Thread, DataInputStream input; PrintStream output;,String user; Socket clientSocket;,serverThread(,Socket clientSocket,), this.clientSocket=clientSocket; ,public void run(), try input=new DataInputStream,(clientSocket.getInputStream();,output=System.out; user=input.readLine();,System.out.println(user+ Connected!);,catch(IOException e) ,try while(true) String string;,if(string=input.readLine()=null) break;,output.println(user+string); output.flush(); ,catch(Exception e) return; ,System.out.println(user+ has disconnected.);,try clientSocket.close(); input.close();,catch(Exception e) return; ,server,Hello 1076,Hello 1071,abc,WAIT GOabc,WAIT GOdef,def,10.3 Socket,例:通过服务器交换信息(exchangebyserver),10.3 Socket,.,服务器,(1111),accept,socket,客,户,IP client1,线程,客,户,IP client2,线程,服务器一端为了能接收多个客户的信息,它的输入流,输出流都是数组型的,.,ServerSocket.accept(),等待用户连接,一旦连接上,则调用服务程序,.,服务程序的主要内容是网络的读写,网络读写的功能用多线程实现,因此将此部分功能单独分离出来,构成线程类,10.3 Socket,client1,client2,serviceRequest,server,ServerSocket,Socket,getOutputStream,getInputStream,reader.run,reader.run,服务器端,accept(),reader.start(),read_net_input,write_net_output(),client(),write.run,write_net_output(),read_net_input(),close_server(),客户端,writer.start(),paint(),socket,getLocalPort(),getInputStream,getOutputStream,服,务,器,10.3 Socket,10.4 Datagram,TCP/IP传输层由两个并列的协议:TCP,UDP.,一般套接字(TCP)提供一个可靠的传输模型作为两个网络端点的字节流,有纠错能力.,UDP没有保持的连接和数据流,数据报是一个网络上发送的独立信息,它的到达,到达时间,以及内容不能得到保证.,socket,server,client,datagram,server,client,10.4 Datagram,TCP提供高可靠性服务,适用于一次要传输交换大量报文的情况,信道上传递的包不需要源地址和目的地址,UDP提供高效率服务,适用于依次传输交换少量报文的情形 (如数据库查询),每个数据包要包含目的地址和端口号.,数据报文的使用以包为中心:打包,拆包.,J包支持两种不同的在网络上送数据的方法:一般套接字和数据报文套接字.,10.4 Datagram,发出报文的标准步骤如下,:,1.,定义数据成员,DatagramSocket socket;,DatagramPacket packet;,InetAddress address;(,用来存放接收方的地址,),int port; ;(,用来存放接收方的端口号,),2.,创建数据报文,Socket,对象,try socket=new DatagramSocket(1111);,catch(.SocketException e) ,socket,绑定到一个本地的可用端口,等待接收客户的请求,.,10.4 Datagram,3.,分配并填写数据缓冲区,(,一个字节类型的数组,),byte Buf=new byte256;,存放从客户端接收的请求信息,.,4.,创建一个,DatagramPacket,packet=new DatagramPacket(buf, 256);,用来从,socket,接收数据,它只有两个参数,5.,服务器阻塞,socket.receive(packet);,在客户的请求报道来之前一直等待,10.4 Datagram,6.,从到来的包中得到地址和端口号,InetAddress address=packet.getAddress();,int port=packet.getPort();,7.,将数据送入缓冲区,或来自文件,或键盘输入,10.,建立报文包,用来从,socket,上发送信息,packet=new DatagramPacket,(buf,buf.length, address,port);,9.,发送数据包,10.,关闭,socket,socket.send(packet); socket.close();,10.4 Datagram,客户端接收包的步骤如下,:,1.,定义数据成员,int port; InetAddress address;,DatagramSocket socket;,DatagramPacket packet;,byte sendBuf=new byte256;,2.,建立,socket,socket=new DatagramSocket();,10.4 Datagram,3.,向服务器发出请求报文,address=InetAddress.getByName(args0);,port=parseInt(args1);,packet=new,DatagramPacket(sendBuf,256,address,port);,socket.send(packet);,这个包本身带有客户端的信息,4.,客户机等待应答,packet=new DatagramPacket(sendBuf,256);,socket.receive(packet);(,如果没有到就一直等待,因此实用程序要设置时间限度,),10.4 Datagram,5,.,处理接收到的数据,String received=new String(packet.getData(),0);,System.out.println(received);,数据报套接字首先是强调发送方和接收方的区别,同时也指出服务器和客户之间的不同,:,一个客户机必须事先知道服务器的地址和端口,以便进行出事连接,一个服务器从它接收到的数据报文中读取客户端的地址和端口,.,10.4 Datagram,.,建立数据报,socket();,建立一个报文包,packet,等待请求报文,建立数据报,socket,建立一个请求包,发出请求,获得对方地址,构成信息包,发送出去,创建接收包,等待接收,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!