java与网络编程.ppt_第1页
java与网络编程.ppt_第2页
java与网络编程.ppt_第3页
java与网络编程.ppt_第4页
java与网络编程.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八讲:java与网络编程,目录,1、 Java与internet 2、 使用InetAddress和URL 3、URL连接 4、 访问WWW资源 5、 Socket 6、 数据报,1、Java与网络,网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。 TCP/IP(传输控制协议/网间协议)是internet的主要协议,定义了计算机和外设进行通信所使用的规则(应用层,传输层,网络层,链路层).,1、Java与网络,IP地址:标识计算机等网络设备的网络地址,由四个8位的二进制数组成,中间以小数点分隔。 如: , 0 主机名(hostname):网络地址的助记名,按照域名进行分级管理。 如: 端口号(port number):网络通信时同一机器上的不同进程的标识。 如:80,21,23,25,其中11024为系统保留的端口号 服务类型(service):网络的各种服务。 http, telnet, ftp, smtp,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与网络,Java提供的网络功能有三大类: URL, Socket, Datagram. URL是三大功能中最高级的一种,通过URL Java程序可以直接送出或读入网络上的数据. Socket是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道. Datagram是更低级的网络传输方式,它把数据的目的纪录在数据包中,然后直接放在网络上.,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.2、使用URL,URL(Uniform Resource Locator)是一致资源定位器的简称,它表示Internet上某一资源的地址。通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。 URL是最为直观的一种网络定位方法。使用URL符合人们的语言习惯,容易记忆,所以应用十分广泛。而且在目前使用最为广泛的TCP/IP中对于URL中主机名的解析也是协议的一个标准,即所谓的域名解析服务。,2.2、使用URL,protocol:/resourceName 协议名(protocol)指明获取资源所使用的传输协议,如http、ftp、gopher、file等,资源名(resourceName)则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。例如: / 协议名:/主机名 /home/welcome.html 协议名:/机器名文件名 :80/Gamelan/network.html#BOTTOM 协议名:/机器名端口号文件名内部引用,2.2、使用URL,我们可以通过下面的构造方法来初始化一个URL对象: (1) public URL (String spec); 通过一个表示URL地址的字符串可以构造一个URL对象。 URL urlBase=new URL(“http:/www. 263.net/“) (2) 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,public String getProtocol() 获取该URL的协议名。 public String getHost() 获取该URL的主机名。 public int getPort() 获取该URL的端口号,如果没有设置端口,返回-1。 public 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、使用URL,通过URL读取WWW服务器上的数据 将URL位置的数据转成一个数据流,URL url=new (/index.html”); DataInputStream data=new DataInputStream(url.openStream(); /*从数据流中读出数据*/ String line=data.readLine() while(line!=null) line=data.readLine(),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; ,3、URL连接,URL双向通信(URLConection) URLConnection是一个一http为中心的类 1. 建立连接 URL url=new URL(“/”); URLConnection con=url.openConnection(); 2. 向服务器端送数据 PrintStream outStream=new PrintStream(con.getOutputStream(); outStream.println(string_data);,3、URL连接,3. 从服务器读数据 DataInputStream inStream=new DataInputStream(con.getInputStream(); inStream.readLine();,客户端,java程序,DataOutputStream,DataInputStream,CGI程序,STDIN,STDOUT,服务器,( 排序 sort.cgi),connectiuon,getchar(),putchar(),3、URL连接,URLConnection同时支持get和post两种机制一般的格式. 缺省情况下为post method方式 URL和URLConnection的区别在于前者代表一个资源的位置,后者代表一种连接 下面的例子中Java程序访问cgi程序,并传给它10个数据,cgi程序胡接收后,排序,并传送回来.这个例子演示了连接的建立、数据流的建立、java如何发数据、如何接收数据、cgi程序如何发送和接收,import java.io.*; import .*; public class test_cgi public static void main(String args) throws Exception URL url = new URL(“/wangqb/cgi-bin/test.cgi“); URLConnection connection = url.openConnection(); connection.setDoOutput(true); PrintStream out = new PrintStream(connection.getOutputStream(); out.println(“0123456789“); out.close();,DataInputStream in = new DataInputStream(connection.getInputStream(); String inputLine; while (inputLine = in.readLine() != null) System.out.println(inputLine); System.in .read (); in.close();,你是第个来访者,4、访问WWW,起始页上的计数器及WWW程序(script),4、访问WWW,4、访问cgi,cgi(公共网关)程序可以用任何一种变成语言来写. cgi将web与外部程序连接起来(数据库查询等) cgi程序要放在指定的目录下cgi-bin目录. cgi通常以GET或POST接收数据,4、访问cgi,从小应用中运行CGI程序(GET) Socket runcgi=new Socket(“”,80); OutputStream os=runcgi.getOutputStream(); PrintStream ps=new PringtStream(os); ps.println(“GET/cgi-bin/testcgi? arg1=val1,8.3 访问cgi,import java.io.*; import .*; public class test_cgi public static void main(String args) throws Exception URL url = new URL (“/wangqb/CGI- BIN/test_2.cgi?012345678“); URLConnection connection = url.openConnection(); #include “stdio.h” main() char *Query_String; Query_String = getenv(“QUERY_STRING“); /*treatment*/ ,4、访问cgi,post方法通过标准输出向cgi传送参数(适合参数较多的情况) 用post方法要有数据输出流,Socket runcgi=new Socket(“”,80);/建立socket连接 DataOutputStream ds=runcgi.getOutputStream();/建立输入流 ds.println(“POST/cgi-bin/guestbook.pl”); ds.println(“Content-type:plain/text”); /通知发送的数据类型 /通知发送的数据长度 String data=“Hello world” ds.println(“Content-length”+data.length+”n”); /发送数据 ds.println(data);,5、Socket,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。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,在服务器端通过指定一个用来等待的连接的端口号创建一个 ServerSocket实例. 在客户端通过规定一个主机和端口号创建一个 socket实例,连到服务器上. ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求 Socket类和ServerSocket是基于TCP协议的,TCP协议提供64个端口,256以内位保留端口.,5、 Socket,在本地机器上测试网络程序用回送地址Socket socket=new Socket(“”,2525); 如果网络的一端已经关闭,另一端读到null. 建立socket连接后,还应该建立输入输出数据流.,5、Socket,5、Socket,下面的例子演示一个简单的服务器与客户的交互,即服务器等待,客户访问,相互通一次信息.,8.5 Socket,. 8.5 Socket,创建服务器(端口号),定义数据成员,服务器等待 网络连接,建立socket流,读客户 端信息,向用户发出一个字符串,创建Socket实例,定义数据成员,建立socket流,读socket流 (接收并显示),送用户名给 服务器,关闭流,waiting for user, 1111,1111,login:,connetcting client.,java,提示用户登录成功,读socket流,User :java,Login successful,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);,创建服务器(端口号),定义数据成员,服务器等待 网络连接,.,ps=new PrintStream(clientSocket.getOutputStream(); dis=new DataInputStream(clientSocket.getInputStream();,建立socket流,向客户发出登录要求,ps.println(“login:“); ps.flush();,ps.println(“login sucessful“); ps.flush(); System.out.println(username+“ has logged off“);,读客户 端信息,通知客户连接完毕,if (username=dis.readLine()=null) System.out.println(“readLine returned null“); System.exit(1); System.out.println(“Username:“+username);,创建Socket实例,PrintStream output; DataInputStream input; String string; Socket socket=null;,定义数据成员,trysocket=new Socket(““,1111); catch(IOException e) System.out.println(“Error ”+e); return;,input=new DataInputStream(socket.getInputStream(); output=new PrintStream(socket.getOutputStream();,建立socket流,.,System.out.println(input.readLine();,读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.“);,读服务器反馈,. 8.5 Socket,. 8.5 Socket,创建服务器(端口号),定义数据成员,服务器等待 网络连接,建立socket流,读客户 端信息,向用户发送字符串,创建Socket实例,定义数据成员,建立socket流,读socket流 (看到提示),送用户名给 服务器,关闭流,waiting for user, 1111,1111,login:,connetcting client.,java,提示用户登录成功,读socket流,User :java,Login successful,5、Socket支持多客户,一种解决方案: 一台计算机上一次启动多个服务器程序,只要端口号不同.,5、Socket支持多客户,第二种方案:,Server,client1,client2,serverthread,serverthread,将服务器写成多线程的,不同的线程为不同的客户服务. main()只负责循环等待 线程负责网络连接,接收客户输入的信息,5、Socket,客户1,客户2,服务器,线程(),线程2,创建服务器(端口号),定义数据成员,服务器等待 网络连接,建立socket流,读客户 端信息,提示用户输入客户名,创建Socket实例,定义数据成员,建立socket流,读socket流 (看到提示),送用户名给 服务器,关闭流,waiting for user, 1111,1111,login:,connetcting client.,java,提示用户登录成功,读socket流,User :java,Login successful,8.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(); ,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; ,server,Hello 1076,Hello 1071,abc,WAIT GOabc,WAIT GOdef,def,5、Socket,例:通过服务器交换信息(exchangebyserver),.,服务器 (1111) accept socket,客 户,IP client1,线程,客 户,IP client2,线程,服务器一端为了能接收多个客户的信息,它的输入流,输出流都是数组型的. ServerSocket.accept()等待用户连接,一旦连接上,则调用服务程序. 服务程序的主要内容是网络的读写,多客户的原因,网络读写的功能用多线程实现,因此将此部分功能单独分离出来,构成线程类,5、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,服 务 器,5、Socket,6、 Datagram(数据报),TCP/IP传输层由两个并列的协议:TCP,UDP. 一般套接字(TCP)提供一个可靠的传输模型作为两个网络端点的字节流,有纠错能力. UDP没有保持的连接和数据流,数据报是一个网络上发送的独立信息,它的到达,到达时间,以及内容不能得到保证.,socket,server,client,datagram,server,client,6、Datagram,TCP提供高可靠性服务,适用于一次要传输交换大量报文的情况,信道上传递的包不需要源地址和目的地址 UDP提供高效率服务,适用于依次传输交换少量报文的情形 (如数据库查询),每个数据包要包含目的地址和端口号. 数据报文的使用以包为中心:打包,拆包. J包支持两种不同的在网络上送数据的方法:一般套接字和数据报文套接字.,6、Datagram,发出报文的标准步骤如下: 1. 定义数据成员 DatagramSocket socket; DatagramPacket packet; InetAddress address;(用来存放接收方的地址) int port; ;(用来存放接收方的端口号) 2. 创建数据报文Socket对象 try socket=new DatagramSocket(1111); catch(.SocketException e) socket

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论