java语言ppt教学课件-第九讲-java网络编程基础

java语言ppt教学课件-第九讲-java网络编程基础

ID:33527122

大小:2.07 MB

页数:86页

时间:2018-05-25

上传者:U-5649
java语言ppt教学课件-第九讲-java网络编程基础_第1页
java语言ppt教学课件-第九讲-java网络编程基础_第2页
java语言ppt教学课件-第九讲-java网络编程基础_第3页
java语言ppt教学课件-第九讲-java网络编程基础_第4页
java语言ppt教学课件-第九讲-java网络编程基础_第5页
资源描述:

《java语言ppt教学课件-第九讲-java网络编程基础》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

第九讲网络通信1、网络基本概念2、Java与Internet3、使用InetAddress4、使用URL5、Socket通信6、数据报通信 TCP/IP(TransmissionControlProtocol传输控制协议/InternetProtocol网间协议)是Internet的主要协议,定义了计算机和外设进行通信所使用的规则。TCP/IP网络参考模型包括五个层次:应用层、传输层、网络层、链路层、物理层。ISO/OSI网络参考模型则包括七个层次:应用层、表示层、会话层、传输层、网络层、链路层、物理层。1、网络基本概念物理层 大多数基于Internet的应用程序被看作TCP/IP网络的最上层——应用层,如:ftp,http,smtp,pop3,telnet,nntp等。网络层对TCP/IP网络中的硬件资源进行标识。连接到TCP/IP网络中的每台计算机(或其他设备)都有唯一的地址,这就是IP地址。IP地址实质上是一个32位的整数,通常以“%d.%d.%d.%d”的形式表示,每个d是一个8位整数。在TCP/IP网络中,不同的机器之间进行通信时,数据的传输是由传输层控制的,这包括数据要发往的目标机器及应用程序、数据的质量控制等。TCP/IP网络中最常用的传输协议就是TCP(TransportControlProtocol)和UDP(UserDatagramProtocol)。1、网络基本概念 一台机器通常只通过一条链路连接到网络上,即它只有一个IP地址,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就要靠网络端口号(port)了。端口号是一个标记机器的逻辑通信信道的正整数,端口号不是物理实体。IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的最后终结点,它是TCP和UDP的基础。网络服务httpftp其他服务21telnet端口2380客户程序SocketIP,portIP与端口号组合而得出的Socket,可以完全分辨Internet上运行的程序。1、网络基本概念 端口号是用一个16位的整数来表达的,其范围为0~65535,其中0~1023为系统所保留,专门给那些通用的服务(well-knownservices),如http服务的端口号为80,telnet服务的端口号为23,ftp服务的端口为21,…因此,当我们编写通信程序时,应选择一个大于1023的数作为端口号,以免发生冲突。1、网络基本概念 传输层通常以TCP和UDP协议来控制端点到端点的通信。用于通信的端点是由Socket来定义的,Socket是由IP地址和端口号组成的。传输控制协议(TCP)是在端点与端点之间建立持续的连接而进行通信。建立连接后,发送端将发送的数据印记了序列号和错误检测代码,并以字节流的方式发送出去;接收端则对数据进行错误检查并按序列顺序将数据整理好,数据在需要时可以重新发送,因此整个字节流到达接收端时完好无缺。这与两个人打电话的情形是相似的。TCP协议具有可靠性和有序性,并且以字节流的方式发送数据,它通常被称为流通信协议。1、网络基本概念 与TCP协议不同,用户数据报协议(UDP)则是一种无连接的传输协议。利用UDP协议进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的端点(Socket,主机地址和端口号),然后再将数据报发送出去。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有比较高的效率,这与通过邮局发送邮件的情形非常相似。1、网络基本概念 1、网络基本概念 TCP协议和UDP协议各有各的用处。当对所传输的数据具有时序性和可靠性等要求时,应使用TCP协议;当传输的数据比较简单、对时序等无要求时,UDP协议能发挥更好的作用,如ping、发送时间数据等。1、网络基本概念 2、Java与Internet——Java中的网络支持针对网络通信的不同层次,Java提供的网络功能有四大类:InetAddress、URLs、Sockets、Datagram。InetAddress面向的是网络层(IP层),用于标识网络上的硬件资源。URL面向的应用层,通过URL,Java程序可以直接送出或读入网络上的数据。Sockets和Datagram面向的则是传输层。Sockets使用的是TCP协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信。Datagram则使用UDP协议,是另一种网络传输方式,它把数据的目的地纪录在数据包中,然后直接放在网络上。 2、Java与Internet——Java中的网络支持java.net包中的主要的类和可能产生的例外包括:面向IP层的类:InetAddress(Inet4Address,Inet6Address)面向应用层的类:URL、URLConnection面向网络层的类:TCP协议相关类:Socket、ServerSocketUDP协议相关类:DatagramPacket、DatagramSocket、MulticastSocket可能产生的例外:BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException 类InetAddress可以用于标识网络上的硬件资源,它提供了一系列方法以描述、获取及使用网络资源。InetAddress类没有构造函数,因此不能用new来构造一个InetAddress实例。通常是用它提供的静态方法来获取:publicstaticInetAddressgetByName(Stringhost):host可以是一个机器名,也可以是一个形如“%d.%d.%d.%d”的IP地址或一个DSN域名。publicstaticInetAddressgetLocalHost()publicstaticInetAddress[]getAllByName(Stringhost)publicstaticInetAddressgetByAddress(Stringhost,Byte[]addr)这些方法通常会产生UnknownHostException例外,应在程序中捕获处理。以下是InetAddress类的几个主要方法,通过上述方法获得InetAddress类的实例后就可以使用:publicbyte[]getAddress():获得本对象的IP地址(存放在字节数组中)。publicStringgetHostAddress():获得本对象的IP地址“%d.%d.%d.%d”。publicStringgetHostName():获得本对象的机器名。3、使用InetAddress 下面的例子演示Java如何根据域名自动到DNS(域名服务器)上查找IP地址(与DNS服务器的连接减至一行):publicclassgetIP{publicstaticvoidmain(Stringargs[]){try{InetAddressad=InetAddress.getByName("www.263.net");//InetAddressad=InetAddress.getLocalHost();System.out.println(ad);}catch(UnknownHostExceptione){System.out.println(e.toString());}}}3、使用InetAddress 通过InetAddress,可以获取本机的IP地址:publicclassGetHostName{publicstaticvoidmain(Stringargs[]){try{InetAddressad=InetAddress.getByName(“127.0.0.1");//InetAddressad=InetAddress.getLocalHost();System.out.println(“主机名:”+ad.getHostName());}catch(UnknownHostExceptione){System.out.println(e.toString());}}}3、使用InetAddress 4、使用URLURL是统一资源定位符(UniformResourceLocator)的简称,它表示Internet上某一资源的地址。Internet上的资源包括HTML文件、图象文件、声音文件、动画文件以及其他任何内容(并不完全是文件,也可以是一个对数据库的查询等)。通过URL,就可以访问Internet。浏览器或其他程序通过解析给定的URL就可以在网络上查找相应的文件或其他资源。 4、使用URL一个URL包括两部分内容:协议名称和资源名称,中间用冒号隔开:Protocol:resourceName如:http://www.bjfu.edu.cn协议名称指的是获取资源时所使用的应用层协议,如http,ftp,file等;资源名称则是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个应用。当然,并不是所有的URL都必须包含这些内容。http://www.bjfu.edu.cnhttp://www.bjfu.edu.cn/javaCourse/index.htmlftp://www.bjfu.edu.cn/javaCourse/Techdoc/ch1.ppthttp://www.abc.com:8080/java/network.html#UDP 4、使用URL——在Java中构造URL在java.net包中,提供了类URL来表示URL。类URL提供了很多构造方法来生成一个URL对象:publicURL(String spec)publicURL(URLcontext,Stringspec)publicURL(String protocol,String host,String file)publicURL(String protocol,String host,int port,String file)以下是一些具体的构造实例:URLurl1=newURL(“http://www.bjfu.edu.cn/map/index.html”);URLbase=newURL(“http://www.bjfu.edu.cn”);URLurl2=newURL(base,“mywork1.html”);URLurl3=newURL(base,“mywork2.html”);URLurl4=newURL(“http”,“www.bjfu.edu.cn”,“/abc/test.html”);URLurl5=newURL(“http”,“www.abc.com”,8080,“/java/network.html”);另外还有两种稍微复杂些的构造方法(参见JDK文档)。 当创建URL时发生错误,系统会产生例外MalformedURLException,这是非运行时例外,必须在程序中捕获处理。URLurl1,url2,url3;try{url1=newURL(“file:/D:/image/example.gif”);url2=newURL(“http://www.bjfu.edu.cn/map/”);url3=newURL(url2,“test.gif”);}catch(MalformedURLExceptione){DisplayErrorMessage();}4、使用URL——在Java中构造URL 一个URL对象生成后,其属性是不能被改变的(与String对象相似),但可以通过它给定的方法来获取这些属性:publicStringgetProtocol():获取该URL的协议名publicStringgetHost():获取该URL的主机名publicStringgetPort():获取该URL的端口号publicStringgetPath():获取该URL的文件路径publicStringgetFile():获取该URL的文件名publicStringgetRef():获取该URL在文件中的相对位置publicStringgetQuery():获取该URL的查询名4、使用URL——URL的基本方法ParseURL.java 4、使用URL——URL连接通过URL类提供的方法openConnection(),就可以获得一个URL连接(URLConnection)对象。publicURLConnectionopenConnection()通过URL的方法openStream(),只能从网络上读取资源中的数据。通过URLConnection类,可以在应用程序和URL资源之间进行交互,既可以从URL中读取数据,也可以向URL中发送数据。URLConnection类表示了应用程序和URL资源之间的通信连接。try{URLurl=newURL(“http://www.bjfu.edu.cn”);URLConnectionuc=url.openConnection();}catch(MalformedURLExceptione1){…}catch(IOExceptione2){…} 4、使用URL——URL连接importjava.net.*;importjava.io.*;publicclassReadURLFile{publicstaticvoidmain(Stringargs[])throwsIOException{//URLurl=newURL("http://www.263.net/");URLurl=newURL("http://www.bjfu.edu.cn/english/index.jsp");URLConnectionconnect=url.openConnection();BufferedReaderbuf=newBufferedReader(newInputStreamReader(connect.getInputStream()));BufferedWriterfile=newBufferedWriter(newFileWriter("1.txt"));Stringline;while((line=buf.readLine())!=null){System.out.println(line);file.write(line);file.newLine();}buf.close();file.close();}}URLConnection中最常用的两个方法是:publicInputStreamgetInputStream()publicOutputStreamgetOutputStream() 通过URLConnection对象获取的输入流和输出流(不是所有的资源都可以获得有效的输出流),可以与现有的CGI程序进行交互。URL和URLConnection的区别在于前者代表一个资源的位置,后者代表一种连接。4、使用URL——URL连接OutputStreamInputStream服务器connectionURLurl=newURL("http://www.bjfu.edu.cn/english/index.jsp");URLConnectionconnect=url.openConnection();BufferedReaderbuf=newBufferedReader(newInputStreamReader(connect.getInputStream()));InputStreamReaderInputStreamBufferedReader数据 浏览器实例功能:一个简单的网页浏览器实现超级链接事件技术:基于JEditorPane显示网页内容 importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;importjava.io.*;importjava.net.*;publicclassMyBrowserextendsJFrame{JLabeljLabel;JTextFieldtf;JEditorPanecontent;publicMyBrowser(){//界面设计代码}//显示网页代码(略)//事件处理代码(略)publicstaticvoidmain(Stringargs[]){MyBrowsermb=newMyBrowser();}} super("我的浏览器");Containercon=getContentPane();//创建标签和文本框对象,并将他们添加到面板中,面板添加到程序窗口的北面jLabel=newJLabel("输入连接的网址");tf=newJTextField("");tf.addActionListener(newMyFieldDealing());JPanelpanel=newJPanel();panel.setLayout(newGridLayout(2,1));panel.add(jLabel);panel.add(tf);con.add(panel,BorderLayout.NORTH);content=newJEditorPane();//创建一个JEditorPane对象用来显示网页内容content.setEditable(false);//设置可编辑为false,以响应超链接事件content.addHyperlinkListener(newMyHyperListener());//对content增加超链接监听con.add(newJScrollPane(content),BorderLayout.CENTER);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(400,300);setVisible(true);界面设计代码 //自定义方法,用来显示指定网址的网页内容voidgetThePage(Stringsite){try{content.setPage(site);//设置参数网址site的内容显示在content中}catch(IOExceptionex){JOptionPane.showMessageDialog(this,"连接错误","错误提示",JOptionPane.ERROR_MESSAGE);}}显示网页内容的代码 classMyFieldDealingimplementsActionListener{//处理文本框回车事件publicvoidactionPerformed(ActionEvente){Stringstr=tf.getText();getThePage(str);//调用自定义方法显示网页内容}}classMyHyperListenerimplementsHyperlinkListener{//处理超链接事件publicvoidhyperlinkUpdate(HyperlinkEvente){if(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED){Stringstr=e.getURL().toString();//得到超链接事件的网页getThePage(str);//显示超链接指向的网页}}}事件处理代码 问题:对html、CSS支持不好,页面布局错位等。 实现Java网页浏览器的其他方法使用开源桌面组件JDIC(JDesktopIntegrationComponents)网址:http://jdic.dev.java.net/参考代码见下页: importjava.awt.BorderLayout; importjava.awt.event.*; importjava.net.MalformedURLException; importjava.net.URL; importjava.util.logging.Level; importjava.util.logging.Logger; importjavax.swing.*; importorg.jdesktop.jdic.browser.IWebBrowser; importorg.jdesktop.jdic.browser.WebBrowser; importorg.jdesktop.jdic.browser.WebBrowserEvent; importorg.jdesktop.jdic.browser.WebBrowserListenerAdapter;publicclassTest1extendsJPanelimplementsActionListener{  privateJTextFieldinput;  privateJButtongo;  privateIWebBrowserweb;  publicTest1(){   super(newBorderLayout());   initWindow();  }  privatevoidinitWindow(){   try{    web=newWebBrowser();    web.addWebBrowserListener(newMyListener());    go=newJButton("转到");    input=newJTextField();    JPanelup=newJPanel(newBorderLayout());    up.add(input,BorderLayout.CENTER);    up.add(go,BorderLayout.EAST);    this.add(up,BorderLayout.NORTH);    this.add(web.asComponent(),BorderLayout.CENTER);    input.addActionListener(this);    go.addActionListener(this);   }catch(Exceptionex){    Logger.getLogger(Test1.class.getName()).log(Level.SEVERE,null,ex);   }   JFramejf=newJFrame("JAVA浏览器");   jf.add(this,BorderLayout.CENTER);   jf.setSize(500,300);   jf.setLocationRelativeTo(null);   jf.setVisible(true);   jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  }publicvoidactionPerformed(ActionEventae){   doOpen();  }privatevoiddoOpen(){   try{    Stringtext=input.getText();    if(text==null||text.equals("")){     return;    }    if(!text.toLowerCase().startsWith("http://")){     text="http://"+text;    }    web.setURL(newURL(text));   }catch(MalformedURLExceptionex){    Logger.getLogger(Test1.class.getName()).log(Level.SEVERE,null,ex);   }  }  publicstaticvoidmain(String[]args){   newTest1();  }  privateclassMyListenerextendsWebBrowserListenerAdapter{   privateMyListener(){}   @Override   publicvoiddocumentCompleted(WebBrowserEventarg0){    System.out.println("文档下载完。。。");    web.executeScript("alert('文档下载完毕!')");    //web.setContent("

Helloworld!!

"+    //"点我");    //web.removeWebBrowserListener(this);   }  } } 实现Java网页浏览器的其他方法http://lobobrowser.org/Java实现的浏览器开源项目 5、Socket通信在Java中,基于TCP协议实现网络通信的类有两个:在客户端的Socket类和在服务器端的ServerSocket类。在服务器端通过指定一个用来等待的连接的端口号创建一个ServerSocket实例。在客户端通过规定一个主机和端口号创建一个Socket实例,连到服务器上。ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求。 构造方法:publicSocket(String host,int port)//远程服务器IP及响应端口publicSocket(InetAddress address,int port)publicSocket(String host,int port,InetAddress localAddr,int localPort)publicSocket(InetAddress address,int port,InetAddress localAddr,int localPort)//在指定的机器上的指定端口上运行这些方法都将抛出例外IOException,程序中需要捕获处理。5、Socket通信——类Socket Socket的输入/输出流管理publicInputStreamgetInputStream()publicvoidshutdownInput()publicOutputStreamgetOutputStream()publicvoidshutdownOutput()这些方法都将抛出例外IOException,程序中需要捕获处理。关闭Socketpublicvoidclose()throwsIOException设置/获取Socket数据publicInetAddressgetInetAddress()、publicintgetPort(),…publicvoidsetSoTimeout(int timeout),…这些方法都将抛出例外SocketException,程序中需要捕获处理。5、Socket通信——类Socket 构造方法:publicServerSocket(int port)publicServerSocket(int port,int backlog)//支持指定数目的连接publicServerSocket(int port,int backlog,InetAddress bindAddr)//在指定的机器上运行这些方法都将抛出例外IOException,程序中需要捕获处理。主要方法publicSocketaccept():等待客户端的连接publicvoidclose():关闭Socket设置/获取Socket数据publicInetAddressgetInetAddress()、publicintgetLocalPort(),…publicvoidsetSoTimeout(int timeout),…这些方法都将抛出例外SocketException,程序中需要捕获处理。5、Socket通信——类ServerSocket 5、Socket通信无论一个Socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本步骤:1、在客户方和服务器方创建Socket/ServerSocket实例。2、打开连接到Socket的输入/输出流。3、利用输入/输出流,按照一定的协议对Socket进行读/写操作。4、关闭输入/输出流和Socket。通常,程序员的主要工作是针对所要完成的功能在第3步进行编程,第1、2、4步对所有的通信程序来说几乎都是一样的。 5、Socket通信Server端程序ServerSocket(port#)Socketsocket=ServerSocket.accept()接收连接OutputStreamInputStreamCloseSocketClient端程序Socket(host,port#)与服务器建立连接OutputStreamInputStreamCloseSocketsocket 5、Socket通信1、建立Socket在客户端:try{Socketclient=newSocket(host,4444);}catch(IOExceptione){}在服务器端:try{ServerSocketserver=newServerSocket(4444);}catch(IOExceptione){}Socketsocket=null;try{socket=server.accept();//等待客户端连接}catch(IOExceptione){} BufferedReader=newBufferedReader(newInputStreamReader(socket.getInputStream()));BufferedWriter=newBufferedWriter(newInputStreamWriter(socket.getOutputStream()));2、在客户端和服务器端同时打开输入/输出流类Socket提供了方法getInputStream()和getOutputStream()来得到Socket对应的输入/输出流以进行数据读写(传输)操作,它们分别返回InputStream对象和OutputStream对象。为了便于读写数据,应在返回的输入/输出流对象上建立过滤流,如DataInputStram/DataOutputStram、BufferedInputStream/BufferedOutputStream、PrintStream;InputStreamReader/OutputStreamWriter、BufferedReader/BufferedWriter、PrintWriter等。5、Socket通信 3、关闭输入/输出流和Socket在客户端和服务器端分别关闭输入/输出流和Socket:先关闭所有相关的输入/输出流,再关闭Socket。5、Socket通信 创建服务器(端口号)定义数据成员服务器等待网络连接建立socket流发送谈话信息接收用户谈话信息创建Socket实例定义数据成员建立socket流发送谈话信息接收服务器谈话信息关闭流accept()127.0.0.144444444结束谈话(Bye.)结束谈话(Bye.)关闭流服务器端客户端 5、Socket通信Client.java看看这个谈话程序的运行效果:2、客户端Server.java1、服务器端 5、Socket通信importjava.io.*;importjava.net.*;publicclassServer{publicstaticvoidmain(String[]args){try{System.out.println("建立并等待连接......");ServerSocketserverSocket=newServerSocket(5500);SocketconnectToClient=serverSocket.accept();DataInputStreaminFromClient=newDataInputStream(connectToClient.getInputStream());DataOutputStreamoutToClient=newDataOutputStream(connectToClient.getOutputStream());Stringstr;doubleradius;while(true){str=inFromClient.readUTF();if(str.equals("bye")){outToClient.writeUTF("bye");break;}radius=Double.parseDouble(str);System.out.println("从客户端接收的半径:"+radius);doublearea=radius*radius*Math.PI;doublevolume=4*Math.PI*radius*radius*radius/3;Strings="半径为"+radius+"圆的面积"+area+" 半径为"+radius+"球的体积"+volume;outToClient.writeUTF(s);outToClient.flush();System.out.println("结果已求出并发送到客户:");}inFromClient.close();outToClient.close();serverSocket.close();}catch(IOExceptione){e.printStackTrace();}}} importjava.io.*;importjava.net.*;publicclassClient{publicstaticvoidmain(String[]args){try{//创建一个客户端Socket对象,连接到服务器的5500端口SocketconnectToServer=newSocket("localhost",5500);DataInputStreaminFromServer=newDataInputStream(connectToServer.getInputStream());DataOutputStreamoutToServer=newDataOutputStream(connectToServer.getOutputStream());System.out.println("#输入的半径发送到服务器。");System.out.println("#输入bye,则终止连接。");Strings;while(true){System.out.print("请输入半径:");BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));s=br.readLine();outToServer.writeUTF(s);outToServer.flush();Strings1=inFromServer.readUTF();if(s1.equals("bye"))break;System.out.println("从服务器返回的计算结果:");System.out.println(s1);System.out.println();}inFromServer.close();outToServer.close();connectToServer.close();}catch(IOExceptione){e.getStackTrace();}}} 5、Socket通信——简单的Client/Server在本地机器上测试网络程序用回绕地址Socketsocket=newSocket(“127.0.0.1”,5500);建立socket连接后,还应该建立输入输出数据流。在运行时,服务器端程序一般应先行启动。 Server(1111)client(2222)Server(2222)client(1111)Server解决方案一:在一台计算机上一次启动多个服务器程序,只要端口号不同。myserver1<-------->myclient1myserver2<-------->myclient25、Socket通信——支持多Client 解决方案二:将服务器写成多线程的,不同的处理线程为不同的客户服务。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。//主线程while(true){等待连接;创建线程;}endwhile5、Socket通信——支持多Client服务器(4444)acceptsocket客户2IP1client1线程1客户1IP2client2线程2 //MultiServer.javaimportjava.io.*;importjava.net.*;publicclassMultiServer{publicstaticvoidmain(Stringargs[])throwsIOException{System.out.println("建立并等待连接......");ServerSocketserverSocket=newServerSocket(5500);SocketconnectToClient=null;while(true){connectToClient=serverSocket.accept();newServerThread(connectToClient);}}}多线程版本: //ServerThread.javaimportjava.io.*;importjava.net.*;publicclassServerThreadextendsThread{privateSocketconnectToClient;//定义套接字对象privateDataInputStreaminFromClient;//从套接字读取数据privateDataOutputStreamoutToClient;//向套接字中输出数据//初始化并启动线程publicServerThread(Socketsocket)throwsIOException{connectToClient=socket;inFromClient=newDataInputStream(connectToClient.getInputStream());outToClient=newDataOutputStream(connectToClient.getOutputStream());start();//启动线程,将执行run方法}//run方法…..}publicvoidrun(){//线程启动后将执行该方法try{Stringstr;doubleradius;while(true){str=inFromClient.readUTF();//从套接字中读取字符串if(str.equals("bye")){//如果是字符串则断开连接outToClient.writeUTF("bye");break;}radius=Double.parseDouble(str);System.out.println("接收到半径值:"+radius);doublearea=radius*radius*Math.PI;doublevolume=4*Math.PI*radius*radius*radius/3;Strings="半径为"+radius+"圆的面积"+area+" 半径为"+radius+"球的体积"+volume;outToClient.writeUTF(s);outToClient.flush();System.out.println("计算结果已发送给客户。");}inFromClient.close();outToClient.close();connectToClient.close();}catch(IOExceptione){e.printStackTrace();}} UDP协议是无连接的协议,它以数据报作为数据传输的载体。数据报是一个在网络上发送的独立信息,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,每个数据报的大小限定在64KB以内。UDP协议无需在发送方和接收方建立连接,但也可以先建立连接。数据报在网上可以以任何可能的路径传往目的地。在Java中,基于UDP协议实现网络通信的类有三个:用于表达通信数据的数据报类DatagramPacket用于进行端到端通信的类DatagramSocket用于广播通信的类MulticastSocket。6、数据报通信datagramserverclient 构造方法publicDatagramPacket(byte[]buf,intlength)publicDatagramPacket(byte[]buf,intoffset,intlength)//这两个方法用于描述接收数据报publicDatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)publicDatagramPacket(byte[]buf,intoffset,intlength,InetAddressaddress,intport)//这两个方法用于发送数据报获取数据——获取接收数据报中的信息publicInetAddressgetAddress()publicbyte[]getData()publicintgetLength()publicintgetOffset()publicintgetPort()设置数据——设置发送数据报中的信息setAddress(InetAddressiaddr)、setPort(intiport)、setData(byte[]buf)、setData(byte[]buf,intoffset,intlength)、setLength(intlength)6、数据报通信——数据报:类DatagramPacket 构造方法publicDatagramSocket()publicDatagramSocket(intport)//在指定的端口通信publicDatagramSocket(intport,InetAddressladdr)//在指定的地点运行这三个方法都将抛出例外SocketException,程序中需要捕获处理。最主要的方法——发送与接收数据报publicvoidreceive(DatagramPacketp)publicvoidsend(DatagramPacketp)这两个方法都将抛出例外IOException,程序中需要捕获处理。其他方法publicvoidconnect(InetAddressaddress,intport)//与指定的机器通信,有连接publicvoiddisconnect()//关闭与指定机器的连接publicvoidclose()//关闭Socket6、数据报通信——点到点通信:类DatagramSocket 建立数据报socket建立一个接收数据报等待请求报文建立数据报socket建立一个请求数据报(发送)发出请求获得对方地址(通过接收数据报)构成发送数据报发送出去创建接收数据报等待接收接收端(客户端)发送端(服务器端) 6、数据报通信——点到点通信服务器端接收并发出数据报的标准步骤:1.定义数据成员privatebyte[]buffer=newbyte[1024];privateDatagramPacketinPacket,outPacket;privateDatagramSocketdatagramSocket;2.创建数据报Socket对象datagramSocket=newDatagramSocket(8000);socket绑定到一个本地的可用端口,等待接收客户端的请求。 3.创建一个接收数据报DatagramPacketinPacket=newDatagramPacket(buffer,buffer.length);用来从socket接收数据,它只需要两个参数。4.服务器阻塞(等待接收数据)datagramSocket.receive(inPacket);//接收数据在客户的请求数据报到来之前一直等待。5.从到来的接收数据报中得到客户端的地址和端口号InetAddressclientAddress=inPacket.getAddress();//得到客户端的地址和端口intclientPort=inPacket.getPort();Strings=newString(inPacket.getData(),0,inPacket.getLength());6、数据报通信——点到点通信 6.准备需要发送的数据:将数据送入缓冲区bufpublicbyte[]getTime()或来自文件、或键盘输入7.建立发送数据报,用来从socket向客户端发送信息outPacket=newDatagramPacket(buffer,buffer.length,clientAddress,clientPort);outPacket.setData(getTime());8.发送数据包datagramSocket.send(outPacket);9.关闭socketdatagramSocket.close();6、数据报通信——点到点通信 6、数据报通信——点到点通信客户端发送并接收数据报的标准步骤:1.定义数据成员privatebyte[]buffer=newbyte[1024];privateDatagramPacketoutPacket,inPacket;privateDatagramSocketdatagramSocket;privateInetAddresshostAddress;2.建立socketdatagramSocket=newDatagramSocket();无须指定端口号,它会自动获得一个可用的端口号。 6、数据报通信——点到点通信3.向服务器端发出请求数据报(发送数据报)hostAddress=InetAddress.getByName("localhost");outPacket=newDatagramPacket(buffer,buffer.length,hostAddress,8000);Strings="客户请求时间服务";outPacket.setData(s.getBytes());datagramSocket.send(outPacket);这个数据报本身会带有客户端的信息4.客户端等待服务器端的应答(通过接收数据报接收数据)inPacket=newDatagramPacket(buffer,buffer.length);datagramSocket.receive(inPacket);如果没有到就一直等待,最好设置等待时间限度5.处理接收到的数据s=newString(inPacket.getData(),0,inPacket.getLength()); 6、数据报通信——广播通信DatagramSocket只允许数据报发往一个目的地址。java.net类包中提供了类MulticastSocket,允许将数据报以广播的方式发送到某个端口的所有客户。类MulticastSocket是在客户端(接收端)使用,监听服务器端广播来的数据;而服务器端仍然使用DatagramSocket来发送数据,只是发送的数据报的目的地址有所变化。 类MulticastSocket:从DatagramSocket继承而来构造方法publicMulticastSocket()publicMulticastSocket(intport):在指定的端口通信这两个方法都将抛出例外IOException,程序中需要捕获处理。主要方法publicvoidjoinGroup(InetAddressmcastaddr):加入一个广播组publicvoidleaveGroup(InetAddressmcastaddr):离开一个广播组publicvoidsetTimeToLive(intttl):指定数据报离开时间publicvoidsend(DatagramPacketp,byte ttl):在指定的时间内将数据报发送出去这四个方法都将抛出例外IOException,程序中需要捕获处理。继承DatagramSocket的方法publicvoidreceive(DatagramPacketp):接收数据publicvoidsend(DatagramPacketp):发送数据publicvoidconnect(InetAddressaddress,int port):与指定的机器通信publicvoiddisconnect():关闭指定的连接publicvoidclose():关闭Socket6、数据报通信——广播通信 6、数据报通信——广播通信MulticastSocketsocket=newMulticastSocket(4446);InetAddressgroup=InetAddress.getByName("230.0.0.1");socket.joinGroup(group);…//receivedatagramsocket.leaveGroup(group);socket.close();InetAddressgroup=InetAddress.getByName("230.0.0.1");DatagramPacketpacket=newDatagramPacket(buf,buf.length,group,4446);socket.send(packet);客户端(MulticastClient.java)服务器端(MulticastServer.java) 广播组的IP地址是一类特殊的IP地址,它们没有分配给网上的硬件资源使用,而是专门保留下来作为广播通信使用的(就像127.0.0.1是专门用来描述本机IP一样)。这一类地址的范围是从224.0.0.0到239.255.255.255,其中地址224.0.0.0又被保留不能被一般应用程序所使用。当前,广播通信只能在应用程序中使用,不能在Applet中使用。6、数据报通信——广播通信 许多防火墙和路由器可以配置为不允许UDP数据报进入。因此,如果想在这种环境下提供UDP网络服务,就需要请求系统管理员重新配置防火墙和路由器,以允许UDP数据报进入。6、数据报通信 使用MulticastSocket实现多点广播DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播方式发送到数量不等的多个客户端。若要使用多点广播时,则需要让一个数据报标有一组目标主机地址,当数据报发出后,整个组的所有主机都能收到该数据报。IP多点广播(或多点发送)实现了将单一信息发送到多个接收者的广播,其思想是设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看做一个组,当客户端需要发送、接收广播信息时,加入到该组即可。 综合实例:C/S考试系统 服务器(5500)acceptsocket客户2IP1client1线程1客户1IP2client2线程2 MultiServer.javaServerThread.javaReadTestFile试卷题库考试成绩客户端 //MultiServer.javaimportjava.io.*;importjava.net.*;publicclassMultiServer{publicstaticvoidmain(Stringargs[])throwsIOException{System.out.println("建立并等待连接......");ServerSocketserverSocket=newServerSocket(5500);SocketconnectToClient=null;while(true){connectToClient=serverSocket.accept();newServerThread(connectToClient);}}}MultiServer.java importjava.io.*;importjava.net.*;importjava.util.*;publicclassServerThreadextendsThread{privateSocketconnectToClient;//服务器端传送/接收数据的套接字privateDataOutputStreamoutToClient;//向客户输出数据privateDataInputStreaminFromClient;//从客户读取数据privateReadTestFilereadTestFile;//读考试文件的对象privateStringselectedAnswer="";//存放用户发送的答案//构造方法//run方法//计算成绩方法//保存成绩方法//关闭socket方法}ServerThread.java publicServerThread(Socketsocket){connectToClient=socket;try{readTestFile=newReadTestFile();//创建读取试题文件内容的类对象inFromClient=newDataInputStream(connectToClient.getInputStream());outToClient=newDataOutputStream(connectToClient.getOutputStream());}catch(IOExceptione){System.out.println("初始化错误!"+e.getMessage());}start();//启动线程}ServerThread.java---构造方法 run方法 privateintgetTestScore(){//百分制记分StringcorrectAnswer=readTestFile.getCorrectAnswer();intn=0,testScore=0;intlength1=correctAnswer.length();intlength2=selectedAnswer.length();intmin=Math.min(length1,length2);for(inti=0;i

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭