好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第八讲java与网络编程课件.ppt

56页
  • 卖家[上传人]:cl****1
  • 文档编号:601268574
  • 上传时间:2025-05-16
  • 文档格式:PPT
  • 文档大小:173.44KB
  • / 56 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,11/7/2009,,‹#›,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第八讲:java与网络编程,,,,,第八讲:java与网络编程,目录,1、 Java与internet,2、 使用InetAddress和URL,3、URL连接,4、 访问WWW资源,5、 Socket,6、 数据报,,,目录1、 Java与internet,1、Java与网络,网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。

      TCP/IP(传输控制协议/网间协议)是internet的主要协议,定义了计算机和外设进行通信所使用的规则(应用层,传输层,网络层,链路层).,,,1、Java与网络网络编程的目的就是指直接或间接地通过网络协,1、Java与网络,IP地址:标识计算机等网络设备的网络地址,由四个8位的二进制数组成,中间以小数点分隔     如:166.111.136.3 , 166.111.52.80,主机名(hostname):网络地址的助记名,按照域名进行分级管理     如:       ,端口号(port number):网络通信时同一机器上的不同进程的标识     如:80,21,23,25,其中1~1024为系统保留的端口号,服务类型(service):网络的各种服务     http, telnet, ftp, smtp,,,1、Java与网络IP地址:标识计算机等网络设备的网络地址,,1、Java与网络,例:获取本机的IP地址,import .*;,public class getLocalHostTest,{ public static void main(),{ InetAddress myIP=null;,try {,myIP=InetAddress.,getLocalHost();},catch,(,UnknowHostException e){},System.out.println(myIP);,},},,,1、Java与网络例:获取本机的IP地址,1、Java与网络,Java提供的网络功能有三大类: URL, Socket, Datagram.,URL是三大功能中最高级的一种,通过URL Java程序可以直接送出或读入网络上的数据.,Socket是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道.,Datagram是更低级的网络传输方式,它把数据的目的纪录在数据包中,然后直接放在网络上.,,,1、Java与网络Java提供的网络功能有三大类: URL,,2.1、InetAddress类,InetAddress类主要用来区分计算机网络中不同节点,即不同的计算机并对其寻址。

      2.1、InetAddress类InetAddress类主要,2.1、 InetAddress类,下面的例子演示java如何根据域名自动到DNS,上查找IP地址(与DNS服务器的连接减至一行),import .*;,public class getIP,{ public static void main(String args[]),{ InetAddress pku=null;,try{ pku=,InetAddress.getByName(“”);,}catch(UnknowHostException e) {},System.out.println(pku); },},,,,2.1、 InetAddress类下面的例子演示java如何,2.2、使用URL,URL(Uniform Resource Locator)是一致资源定位器的简称,它表示Internet上某一资源的地址通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源URL是最为直观的一种网络定位方法使用URL符合人们的语言习惯,容易记忆,所以应用十分广泛。

      而且在目前使用最为广泛的TCP/IP中对于URL中主机名的解析也是协议的一个标准,即所谓的域名解析服务2.2、使用URLURL(Uniform Resource,2.2、使用URL,protocol://resourceName   协议名(protocol)指明获取资源所使用的传输协议,如http、ftp、gopher、file等,资源名(resourceName)则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用例如:    协议名://主机名    协议名://机器名+文件名   :80/Gamelan/network.html#BOTTOM 协议名://机器名+端口号+文件名+内部引用,,,,2.2、使用URLprotocol://resourceNa,2.2、使用URL,我们可以通过下面的构造方法来初始化一个URL对象:,(1) public URL (String spec);  通过一个表示URL地址的字符串可以构造一个URL对象  URL urlBase=new URL("http://www. public URL(URL context, String spec);  通过基URL和相对URL构造一个URL对象。

       URL net263=new URL (“  URL index263=new URL(net263, “index.html”);,(3) public URL(String protocol, String host, String file); new URL("http", "", "/pages/G. html");,(4) public URL(String protocol, String host, int port, String file); URL gamelan=new URL("http", "", 80, "Pages/Gwork.html");,,,2.2、使用URL我们可以通过下面的构造方法来初始化一个UR,2.2、使用URL,public String getProtocol() 获取该URL的协议名public String getHost() 获取该URL的主机名public int getPort() 获取该URL的端口号,如果没有设置端口,返回-1public String getFile() 获取该URL的文件名public String getRef() 获取该URL在文件中的相对位置。

      public String getQuery() 获取该URL的查询信息public String getPath() 获取该URL的路径,public String getAuthority() 获取该URL的权限信息,public String getUserInfo() 获得使用者的信息,public String getRef() 获得该URL的锚,,,2.2、使用URLpublic String getProt,URL,Java 程序,DataInputStream,2.2、使用URL,通过URL读取WWW服务器上的数据,将URL位置的数据转成一个数据流,URL url=new (, data=new,DataInputStream(url.openStream());,/*从数据流中读出数据*/,String line=data.readLine(),while(line!=null) line=data.readLine(),,,URLJava 程序DataInputStream2.2、使,2.2 使用URL,public boolean action(Event evt, Object arg),{ try{,String line;,String str=textfield.getText();,url=new URL(str);,data=new DataInputStream(url.,openStream,());,while((line=,data.readLine,())!=null){,textarea.appendText(line); },data.close();,}catch(MalformedURLException me){,System.out.println("Error URL");,}catch(IOException ie){,System.out.println("Error IO");,},return true;,},,,2.2 使用URLpublic boolean action,3、URL连接,URL双向通信(URLConection),URLConnection是一个一http为中心的类,1. 建立连接,URL url=new URL(“ con=url.openConnection();,2. 向服务器端送数据,PrintStream outStream=new,PrintStream(con.getOutputStream());,outStream.println(string_data);,,,,3、URL连接URL双向通信(URLConection),3、URL连接,3. 从服务器读数据,,DataInputStream inStream=new,DataInputStream(con.getInputStream());,inStream.readLine();,,客户端,,,,java程序,DataOutputStream,DataInputStream,CGI程序,,,,STDIN,STDOUT,服务器,,,,(,排序,sort.cgi),connectiuon,getchar(),putchar(),,,3、URL连接3. 从服务器读数据客户端java程序Data,3、URL连接,URLConnection同时支持get和post两种机制一般的格式.,缺省情况下为post method方式,URL和URLConnection的区别在于前者代表一个资源的位置,后者代表一种连接,下面的例子中Java程序访问cgi程序,并传给它10个数据,cgi程序胡接收后,排序,并传送回来.这个例子演示了连接的建立、数据流的建立、java如何发数据、如何接收数据、cgi程序如何发送和接收,,,,3、URL连接URLConnection同时支持get和po,import java.io.*; import .*;,public class test_cgi,{public static void main(String[] args) throws Exception,{ URL url = new,URL(" connection = url.openConnection();,connection.setDoOutput(true);,PrintStream out = new,PrintStream(connection.getOutputStream());,out.println("0123456789");,out.close();,,,import java.io.*; import java.,DataInputStream in = new,DataInputStream(connection.getInputStream());,String inputLine;,while ((inputLine = in.readLine()) != null),System.out.println(inputLine);,System.in .read ();,in.close();,,,DataInputStream in = new,欢迎来访,你是第 个来访者!,1,2,7,你是第,,个来访者,客户端,,,,HTML,服务器端,,,,CGI程序,,num++,img,cgi,程序名,4、访问WWW,起始页上的计数器及WWW程序(script),,,欢迎来访,你是第,4、访问WWW,,,,send,reset,Your name,,,数据库,服务器,Web服务器,cgi,程序,form,,,,4、访问WWW

      Socket通常用来实现客户方和服务方的连接Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定   在传统的UNIX环境下可以操作TCP/IP协议的接口不止Socket一个,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程   说Socket编程是低层次网络编程并不等于它功能不强大,恰恰相反,正因为层次低,Socket编程比基于URL的网络编程提供了更强大的功能和更灵活的控制,但是却要更复杂一些由于Java本身的特殊性,Socket编程在Java中已经是层次最低的网络编程接口5、Socket 网络上的两个程序通过一个双向的通讯连接实现,5、 Socket,在服务器端通过指定一个用来等待的连接的端口号创建一个 ServerSocket实例.,在客户端通过规定一个主机和端口号创建一个 socket实例,连到服务器上.,ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求,Socket类和ServerSocket是基于TCP协议的,TCP协议提供64个端口,256以内位保留端口.,,,5、 Socket在服务器端通过指定一个用来等待的连接的端口,5、 Socket,在本地机器上测试网络程序用回送地址Socket socket=new Socket(“127.0.0.1”,2525);,如果网络的一端已经关闭,另一端读到null.,建立socket连接后,还应该建立输入输出数据流.,,,5、 Socket在本地机器上测试网络程序用回送地址Sock,5、Socket,,Server,ServerSocket(port #),Server Socket.accept(),Socket(),OutputStream,InputStream,Close Socket,,Client,Socket(host, port #),Attempt the connection,OutputStream,InputStream,Close Socket,,,5、SocketServerServerSocket(por,5、Socket,下面的例子演示一个简单的服务器与客户的交互,即服务器等待,客户访问,相互通一次信息.,,,,5、Socket下面的例子演示一个简单的服务器与客户的交互,,8.5 Socket,. 8.5 Socket,,创建服务器(端口号),定义数据成员,服务器等待,网络连接,建立socket流,读客户 端信息,向用户发出一个字符串,创建Socket实例,定义数据成员,建立socket流,读socket流,(接收并显示),送用户名给,服务器,关闭流,waiting for user,127.0.0.1 1111,1111,login:,connetcting client...,java,提示用户登录成功,读socket流,User :java,Login successful,,,8.5 Socket. 8.5 Socket创建服务器(端口,8.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);},创建服务器(端口号),定义数据成员,服务器等待,网络连接,,,8.5 Socket例:显示服务器与客户机间的通信(服务器端,.,ps=new PrintStream(clientSocket.getOutputStream());,dis=new,DataInputStream(clientSocket.getInputStream());,创建服务器(端口号),定义数据成员,服务器等待,网络连接,建立socket流,向客户发出登录要求,ps.println("login:"); ps.flush();,,,.ps=new PrintStream(clientSock,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);,,,ps.println("login sucessful");,创建Socket实例,PrintStream output;,DataInputStream input;,String string;,Socket socket=null;,定义数据成员,try{socket=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流,,,创建Socket实例PrintStream output;定,.,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...");,读服务器反馈,,,.System.out.println(input.read,,. 8.5 Socket,. 8.5 Socket,,创建服务器(端口号),定义数据成员,服务器等待,网络连接,建立socket流,读客户 端信息,向用户发送字符串,创建Socket实例,定义数据成员,建立socket流,读socket流,(看到提示),送用户名给,服务器,关闭流,waiting for user,127.0.0.1 1111,1111,login:,connetcting client...,java,提示用户登录成功,读socket流,User :java,Login successful,,,. 8.5 Socket. 8.5 Socket创建服务器(,5、Socket--支持多客户,一种解决方案:,一台计算机上一次启动多个服务器程序,只要端口号不同.,Server1(1111),client(2222),Server2(2222),client(1111),Computer 1,,,5、Socket--支持多客户一种解决方案:Server1(,5、Socket--支持多客户,第二种方案:,,Server,,,client1,client2,serverthread,serverthread,将服务器写成多线程的,不同的线程为不同的客户服务.,main()只负责循环等待,线程负责网络连接,接收客户输入的信息,,,5、Socket--支持多客户第二种方案:client1cl,5、Socket,客户1,客户2,服务器,线程(),线程2,线程( ),线程( ),,,,5、Socket客户1客户2服务器线程()线程2线程(,创建服务器(端口号),定义数据成员,服务器等待,网络连接,建立socket流,读客户 端信息,提示用户输入客户名,创建Socket实例,定义数据成员,建立socket流,读socket流,(看到提示),送用户名给,服务器,关闭流,waiting for user,127.0.0.1 1111,1111,login:,connetcting client...,java,提示用户登录成功,读socket流,User :java,Login successful,,,创建服务器(端口号)定义数据成员服务器等待建立socket流,8.5 Socket,public static void main(String args[]),{ServerSocket serverSocket=null;,try{serverSocket=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();,}},,,8.5 Socketpublic static void m,8.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; } }},,,8.5 Socketclass serverThread e,server,,,Hello 1076,Hello 1071,abc,WAIT GO…abc,WAIT GO…def,def,,,,5、Socket,例:通过服务器交换信息(exchangebyserver),,,serverHello 1076Hello 1071abcW,.,服务器,(1111),,accept,socket,,客,户,IP client1,,线程,,客,户,IP client2,,线程,服务器一端为了能接收多个客户的信息,它的输入流,输出流都是数组型的.,ServerSocket.accept()等待用户连接,一旦连接上,则调用服务程序.,服务程序的主要内容是网络的读写,多客户的原因,网络读写的功能用多线程实现,因此将此部分功能单独分离出来,构成线程类,,,,.服务器客IP client1线程客IP client2,5、Socket,,client1,client2,serviceRequest,server,ServerSocket,Socket,getOutputStream,getInputStream,reader.run,reader.run,服务器端,accept(),reader.start(),read_net_input,write_net_output(),,,5、Socketclient1client2serviceR,client(),write.run,write_net_output(),read_net_input(),close_server(),客户端,writer.start(),paint(),socket,getLocalPort(),getInputStream,getOutputStream,服,务,器,5、Socket,,,client()write.runwrite_net_out,6、 Datagram(数据报),TCP/IP传输层由两个并列的协议:TCP,UDP.,一般套接字(TCP)提供一个可靠的传输模型作为两个网络端点的字节流,有纠错能力.,UDP没有保持的连接和数据流,数据报是一个网络上发送的独立信息,它的到达,到达时间,以及内容不能得到保证.,,socket,server,client,datagram,server,client,,,6、 Datagram(数据报)TCP/IP传输层由两个并,6、Datagram,TCP提供高可靠性服务,适用于一次要传输交换大量报文的情况,信道上传递的包不需要源地址和目的地址,UDP提供高效率服务,适用于依次传输交换少量报文的情形 (如数据库查询),每个数据包要包含目的地址和端口号.,数据报文的使用以包为中心:打包,拆包.,J包支持两种不同的在网络上送数据的方法:一般套接字和数据报文套接字.,,,,6、DatagramTCP提供高可靠性服务,适用于一次要传,6、Datagram,发出报文的标准步骤如下:,1. 定义数据成员,,DatagramSocket socket;,DatagramPacket packet;,InetAddress address;(用来存放接收方的地址),int port; ;(用来存放接收方的端口号),2. 创建数据报文Socket对象,try {socket=new DatagramSocket(1111);},catch(.SocketException e) {},socket 绑定到一个本地的可用端口,等待接收客户的请求.,,,6、Datagram发出报文的标准步骤如下:,6、Datagram,3.分配并填写数据缓冲区(一个字节类型的数组),,byte[] Buf=new byte[256]; //存放从客户端接收的请求信息.,4.创建一个DatagramPacket,,packet=new DatagramPacket(buf, 256);,//用来从socket接收数据,它只有两个参数,,5. 服务器阻塞,,socket.receive(packet);,//在客户的请求报道来之前一直等待,,,,6、Datagram3.分配并填写数据缓冲区(一个字节类型,6、Datagram,6. 从到来的包中得到地址和端口号,InetAddress address=packet.getAddress();,int port=packet.getPort();,7. 将数据送入缓冲区,或来自文件,或键盘输入,8. 建立报文包,用来从socket上发送信息,,packet=new DatagramPacket (buf,buf.length, address,port);,9. 发送数据包,10.关闭socket,socket.send(packet); socket.close();,,,6、Datagram6. 从到来的包中得到地址和端口号In,6、Datagram,客户端接收包的步骤如下:,1.,定义数据成员,,int port;,InetAddress address;,DatagramSocket socket;,DatagramPacket packet;,byte[] sendBuf=new byte[256];,2.,建立socket,,socket=new DatagramSocket();,,,6、Datagram客户端接收包的步骤如下:,8.7 Datagram,3.,,向服务器发出请求报文,address=InetAddress.getByName(args[0]);,port=parseInt(args[1]);,packet=new,DatagramPacket(sendBuf,256,address,port);,socket.send(packet);,/*这个包本身带有客户端的信息*/,4.,,客户机等待应答,,packet=new DatagramPacket(sendBuf,256);,socket.receive(packet);//(如果没有到就一直等待,因此实用程序要,//设置时间限度),,,,8.7 Datagram3. 向服务器发出请求报文,6、Datagram,5,. 处理接收到的数据,,String received=new String(packet.getData(),0);,System.out.println(received);,,数据报套接字首先是强调发送方和接收方的区别,同时也指出服务器和客户之间的不同:,一个客户机必须事先知道服务器的地址和端口,以便进行初始连接,一个服务器从它接收到的数据报文中读取客户端的地址和端口.,,,6、Datagram5. 处理接收到的数据,.,建立数据报socket();,建立一个报文包packet,等待请求报文,建立数据报socket,建立一个请求包,发出请求,获得对方地址,构成信息包,发送出去,创建接收包,等待接收,,,.建立数据报socket();建立一个报文包packet等待,。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.