第7章 Java网络编程_第1页
第7章 Java网络编程_第2页
第7章 Java网络编程_第3页
第7章 Java网络编程_第4页
第7章 Java网络编程_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1、1,第7章 Java网络编程,重点内容: 7.1 网络编程基础 7.2 基于TCP的网络编程 7.3 基于UDP的网络编程,2,TCP/IP模型,TCP/IP起源于美国国防部高级研究规划署(DARPA)的一项研究计划实现若干台主机的相互通信。 现在TCP/IP已成为Internet上通信的工业标准。 TCP/IP模型包括4个层次:与ISO/OSI的7层结构有所简化。 应用层 传输层 网络层 网络接口,7.1 网络编程基础,3,各层所使用的协议主要有:,应用层:远程登录协议Telnet、文件传输协议FTP、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP、邮局协议POP3 等。

2、传输层:传输控制协议TCP、用户数据报协议UDP。 网络层:网际协议IP Internet控制报文协议ICMP、Internet组管理协议IGMP等。,7.1 网络编程基础,4,TCP协议,TCP(Transmission Control Protocol),指的是传输控制协议,它是主要负责数据的分组和重组。在简化的计算机网络OSI模型中,它完成传输层所指定的功能 TCP是一个“可靠的”、面向连结的传输机制,通过三次握手建立连接。它提供一种可靠的字节流保证数据完整、无损并且按顺序到达,7.1 网络编程基础,5,UDP协议,UDP(User Datagram Protocol)指的是用户数据报协

3、议。和TCP一样都是网络传输层上的协议,但与TCP有本质的区别 UDP是“不可靠”、无连结和面向消息的协议,它使用数据报进行传输,7.1 网络编程基础,6,端口,端口(Port)可以被理解成计算机与外界通信交流的窗户。网络上的一台计算机可以提供多种服务,单靠IP地址无法将它们区别开,所以通过“IP地址+端口号”的形式来区分不同的服务 端口号是一个整数,通常范围在065535。小于1024的端口号一般的分配给特定的服务协议的,7.1 网络编程基础,7,套接字(socket)的引入,为了方便开发网络应用软件,最早由美国佰克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调用socket(

4、套接字)。Socket的出现使程序员可以很方便地访问TCP/IP,从而开发各种网络应用程序。 随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统中。Java语言也引入了套接字编程模型。,7.1 网络编程基础,8,套接字,套接字,是支持TCP/IP的网络通信的基本操作单元,可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动建立关系 通常用的TCP/IP协议的3种套接字类型有 流套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)、原始套接字(

5、SOCK_RAW) 流套接字用于提供面向连接、可靠的数据传输服务 数据报套接字提供了一种无连接的服务 原始套接字(SOCK_RAW):原始套接字可以读写内核没有处理的IP数据包,可以进行比较底层的操作。一般的程序也涉及不到原始套接字。,7.1 网络编程基础,9,客户/服务器模式,C/S(Client/Server,客户机/服务器)模式又称C/S结构,是20世纪80年代末逐步成长起来的一种模式,是软件系统体系结构的一种 C/S结构的关键在于功能的分布,一些功能放在前端机(即客户机)上执行,另一些功能放在后端机(即服务器)上执行 客户机/服务器的通信基于套接字。套接字是internet通信的端点。

6、可以理解为是客户机和服务器之间的两端 在 Berkeley 套接字中,套接字的概念允许单个计算机同时服务于很多不同的客户,并能够提供不同类型信息的服务,7.1 网络编程基础,10,Java与网络,Java 通过扩展流式输入/输出接口和增加在网络上建立输入/输出对象特性这两个方法支持 TCP/IP Java 支持TCP和UDP协议族 Java提供的网络功能有三大类:URL、Socket、Datagram TCP用于网络的可靠的流式输入/输出。UDP支持更简单的、快速的、点对点的数据报模式,7.1 网络编程基础,11,URL类,URL 提供了一个相当容易理解的形式来惟一确定或对 Internet

7、上的信息进行编址 在 Java 的网络类库中,URL 类为用URL在Internet 上获取信息提供了一个简单的、简洁的用户编程接口(API) URL规范以四个元素为基础:所用到的协议、主机名或所用主机的IP地址、端口号、实际的文件路径 如:,7.1 网络编程基础,12,URL类中常用方法,7.1 网络编程基础,13,URL类中常用方法,7.1 网络编程基础,14,URL类举例,import .*; public class Test public static void main(String args) throws MalformedURLException URL hp = new U

8、RL( System.out.println(Protocol: + hp.getProtocol(); System.out.println(Port: + hp.getPort(); System.out.println(Host: + hp.getHost(); System.out.println(File: + hp.getFile(); System.out.println(Ext: + hp.toExternalForm(); ,Protocol: http Port: -1 Host: File: /download Ext:,7.1 网络编程基础,15,URL类举例,通过UR

9、L类我们可以从网络上获取想要的资源.方法是调用 URL类中的方法 openConnection(),创建一个URLConnection对象,用该对象创建输入/输出流,这样网络上的资源就可以流入本地了. 下面来看一个通过URL下载文件的例子:,7.1 网络编程基础,16,使用URL下载文件的例子:,import java.awt.*; import java.awt.event.*; import .*; import java.io.*; public class Download public static void main(String args) Frame f=new Frame(“

10、程序下载); f.setSize(600,400); f.setLocation(100,100);,7.1 网络编程基础,17,Panel p=new Panel(); Label l=new Label(Please input URL:); final TextField tf=new TextField(30); p.add(l); p.add(tf); f.add(p,North); final TextArea ta=new TextArea(); f.add(ta,Center); Button btn=new Button(Download); f.add(btn,South)

11、; btn.addActionListener(this);,使用URL下载文件的例子:,7.1 网络编程基础,18,public void actionPerformed(ActionEvent e) String str=tf.getText(); try URL url=new URL(str); URLConnection urlConn=url.openConnection(); String line=System.getProperty(line.separator); ta.append(Host: +url.getHost(); ta.append(line); ta.app

12、end(Port: +url.getPort(); ta.append(line); ta.append(ContentType: +urlConn.getContentType(); ta.append(line); ta.append(ContentLength: +urlConn.getContentLength(); InputStream is=urlConn.getInputStream(); FileOutputStream fos=new FileOutputStream(“d.html); int data; while(data=is.read()!=-1) fos.wri

13、te(data); is.close(); fos.close(); catch(Exception ex) ex.printStackTrace(); ,使用URL下载文件的例子:,7.1 网络编程基础,19,f.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); f.show(); ,使用URL下载文件的例子:,7.1 网络编程基础,20,执行结果:,使用URL下载文件的例子:,7.1 网络编程基础,21,7.2 基于TCP的网络编程,Java的T

14、CP编程是通过流式套接字实现的。流式套接字用于在主机和 Internet 之间建立可靠的、双向的、持续的、点对点的流式连接。 J包中有两类TCP套接字。一种是服务器端的套接字serverSocket类 ,另一种是客户端的套接字Socket类。 Socket类:表示双向连接的客户端。 ServerSocket类:表示双向连接的服务端,Java实用编程技术,22,基于TCP的Socket编程,Server,ServerSocket(int port),Socket.accept(),OutputStream Socket.getOutputSrteam(),InputStream Socket.g

15、etInputStream(),Socketclose(),Client,Socket(inetAddress Address, int port),OutputStream Socket.getOutputSrteam(),InputStream Socket.getInputStream(),Socketclose(),7.2 基于TCP的网络编程,23,服务器程序编写: 1.调用ServerSocket(int port)创建一个服务器端套接字,并绑定到指定端口上; 2.调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字. 3.调用Socket类的getO

16、utputStream()和getInputStream()获取输出流和输入流,开始网络数据的发送和接受. 4.最后关闭通信套接字.,7.2 基于TCP的网络编程,24,客户端程序编写: 1.调用Socket()创建一个流套接字,并连接到服务器端; 2.调用Socket类的OutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接受 3.最后关闭通信套接字.,7.2 基于TCP的网络编程,25,下面是一个典型的创建Server端ServerSocket的过程: ServerSocket server=null; try server=new Serve

17、rSocket(4700); /创建一个ServerSocket在端口4700监听客户请求 catch(IOException e) System.out.println(can not listen to :+e); Socket socket=null; try socket=server.accept(); /accept()是一个阻塞的方法,一旦有客户请求, /它就会返回一个Socket对象用于同客户进行交互 catch(IOException e) System.out.println(Error:+e); ,7.2 基于TCP的网络编程,26,下面是一个典型的创建客户端Socket

18、的过程: try Socket socket=new Socket( ,4700); /是TCP/IP协议中默认的本 /机地址 catch(IOException e) System.out.println(Error:+e); ,7.2 基于TCP的网络编程,27,import java.io.*; import .*; public class ServerSoc public static void server() try ServerSocket ss=new ServerSocket(6000); System.out.println(“服务器已

19、经启动”); Socket s=ss.accept(); OutputStream os=s.getOutputStream(); InputStream is=s.getInputStream(); os.write(Hello,welcom you!.getBytes(); byte buf=new byte100; int len=is.read(buf); System.out.println(服务器收到客户信息:+ new String(buf,0,len); os.close(); is.close(); ss.close(); catch(Exception ex) ex.pri

20、ntStackTrace(); ,7.2 基于TCP的网络编程,TCP通信例子:,28,import java.io.*; import .*; public class ClientSoc public static void main(String args) client(); public static void client() try Socket s=new Socket(InetAddress.getByName(null),6000); OutputStream os=s.getOutputStream(); InputStream is=s.getInputStream()

21、; os.write(Hello,this is zhangsan.getBytes(); byte buf=new byte100; int len=is.read(buf); System.out.println(客户收到服务器信息: “ +new String(buf,0,len); os.close(); is.close(); s.close(); catch(Exception ex) ex.printStackTrace(); ,7.2 基于TCP的网络编程,TCP通信例子:,29,服务器窗口显示:,服务器收到客户信息:Hello,this is zhangsan,客户端窗口显示

22、:,客户收到服务器信息: Hello,welcom you!,7.2 基于TCP的网络编程,TCP通信例子:,30,import .*; import java.io.*; public class DemoSocket extends Thread private Socket s; public DemoSocket(Socket s)this.s=s; public void run() try OutputStream os=s.getOutputStream(); InputStream is=s.getInputStream(); os.write(Hello,welcom you

23、!.getBytes(); byte buf=new byte100; int len=is.read(buf); System.out.println(服务器端收到客户端信息: “ + new String(buf,0,len); os.close(); is.close(); s.close(); catch(Exception ex) ex.printStackTrace(); ,7.2 基于TCP的网络编程,TCP多线程编程,31,public static void server() try ServerSocket ss=new ServerSocket(6000); while(

24、true) Socket s=ss.accept(); new DemoSocket(s).start(); catch(Exception ex) ex.printStackTrace(); ,7.2 基于TCP的网络编程,TCP多线程编程,32,public static void client() try Socket s=new Socket(InetAddress.getByName(null),6000); OutputStream os=s.getOutputStream(); InputStream is=s.getInputStream(); byte buf=new byt

25、e100; int len=is.read(buf); System.out.println(客户端收到服务器端信息: “ +new String(buf,0,len); os.write(Hello,this is wuxing.getBytes(); os.close(); is.close(); s.close(); catch(Exception ex)ex.printStackTrace(); ,7.2 基于TCP的网络编程,TCP多线程编程,33,public static void main(String args) if(args.length0) server(); else

26、 client(); ,7.2 基于TCP的网络编程,TCP多线程编程,34,服务器端收到客户端信息: Hello,this is wuxing 服务器端收到客户端信息: Hello,this is zhangsan 服务器端收到客户端信息: Hello,this is wuxing,客户端窗口1显示:,客户收到服务器信息: Hello,welcom you!,客户端窗口2显示:,客户收到服务器信息: Hello,welcom you!,服务器窗口显示:,7.2 基于TCP的网络编程,TCP多线程编程,35,7.3 基于UDP的网络编程,UDP协议 UDP是User Datagram Prot

27、ocol的简称,是一种无连接的协议,每个数据包都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。使用UDP时,每个数据包中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。但使用UDP传输数据是有大小限制的,每个被传输的数据包必须限定在64 KB之内。,36,基于UDP的Socket编程,接收端,DatagramSocket(int port),DatagramPacket(byte buf, int length),DatagramSocket.recerve (Datagra

28、mPacket p),DatagramSocketclose(),发送端,DatagramSocket(),DatagramPacket(byte buf, int length, InetAddress address, Int port),DatagramSocket.send (DatagramPacket p),DatagramSocketclose(),7.3 基于UDP的网络编程,37,接收端程序编写: 1.调用DatagramSocket(int port)创建一个数据报套接字,并绑定到指定端口. 2.调用DatagramPacket(byte buf, int length),

29、创建一个字节数组以接收UDP包. 3.调用DatagramSocket类的receive(),接收UDP包. 4.最后关闭数据报套接字,7.3 基于UDP的网络编程,38,发送端程序编写: 1.调用DatagramSocket()创建一个数据报套接字. 2.调用DataramPacket(byte buf, int offset, int length,InetAddress address,int port),建立要发送的UDP包. 3.调用DatagramSocket类的send(),发送UDP包 4.最后关闭数据报套接字.,7.3 基于UDP的网络编程,39,UDP通信例子: packa

30、ge code; import .*; import java.io.*; public class UdpDemo public static void main(String args) if(args.length0) recev(); else sen(); ,7.3 基于UDP的网络编程,40,public static void recev() tryDatagramSocket ds=new DatagramSocket(6000); byte buf=new byte100; DatagramPacket dp=new DatagramPacket(buf,100); ds.r

31、eceive(dp); System.out.println(“接收端收到: + new String(buf,0,dp.getLength(); String str=Welcom you!; DatagramPacket dpSend=new DatagramPacket(str.getBytes(), str.length(), dp.getAddress(),dp.getPort(); ds.send(dpSend); ds.close(); catch(Exception ex) ex.printStackTrace(); ,7.3 基于UDP的网络编程,UDP通信例子:,41,pu

32、blic static void sen() try DatagramSocket ds=new DatagramSocket(); String str=Hello,this is zhangsan; DatagramPacket dp=new DatagramPacket(str.getBytes(), str.length(),InetAddress.getByName(localhost),6000); ds.send(dp); byte buf=new byte100; DatagramPacket dpRecv=new DatagramPacket(buf,100); ds.rec

33、eive(dpRecv); System.out.println(“发送端: + new String(buf,0,dpRecv.getLength(); ds.close(); catch(Exception ex)ex.printStackTrace(); ,7.3 基于UDP的网络编程,UDP通信例子:,42,接收端显示: 发送端显示:,发送端收到: Welcom you!,接收端收到: Hello,this is zhangsan,7.3 基于UDP的网络编程,43,一个简单的企业内部QQ实例,该实例是UDP通信协议的应用.该实例有几个模块组成: 主窗体类:EQ.java 数据库操作类

34、:Dao.java 用户管理模块:UserTreeRanderer.java 通信模块TelFrame.java,44,45,public class EQ extends Dialog public static void main(String args) try String laf = preferences.get(lookAndFeel, java默认); if (laf.indexOf(当前系统)-1) UIManager.setLookAndFeel(UIManager . getSystemLookAndFeelClassName(); EQ frame = new EQ()

35、; frame.setVisible(true); frame.SystemTrayInitial();/ 初始化系统栏 frame.server(); frame.checkPlacard(); catch (Exception e) e.printStackTrace(); ,46,private void server() / 服务器启动方法 new Thread(new Runnable() public void run() while (true) if (ss != null) byte buf = new byte4096; DatagramPacket dp = new Da

36、tagramPacket(buf, buf.length); try ss.receive(dp); catch (IOException e) e.printStackTrace(); TelFrame.getInstance(ss, dp, chatTree); ).start(); ,47,public TelFrame(DatagramSocket ssArg, DatagramPacket dpArg, final ChatTree treeArg) this.tree = treeArg; ip = dpArg.getAddress().getHostAddress(); dao

37、= Dao.getDao(); user = dao.getUser(ip); frame = this; ss = ssArg; dp = dpArg; buf = dp.getData(); try setBounds(200, 100, 521, 424); . receiveText.setEditable(false); sendButton.addActionListener(new sendActionListener(); sendButton.setText(发送); sendText.setDragEnabled(true); sendText.requestFocus()

38、; .,48,class sendActionListener implements ActionListener public void actionPerformed(final ActionEvent e) String sendInfo = getSendInfo(); /从发送文本框中获得发送信息 if (sendInfo = null) return; insertUserInfoToReceiveText(tree); /将发送者信息加入接受框 appendReceiveText(sendInfo + “n”, null); /将发送信息加入接受框 byte tmpBuf = s

39、endInfo.getBytes(); DatagramPacket tdp = null; try tdp = new DatagramPacket(tmpBuf, tmpBuf.length, new InetSocketAddress(ip, 1111); /构建发送数据包 ss.send(tdp); /发送数据报 catch (SocketException e2) e2.printStackTrace(); catch (IOException e1) e1.printStackTrace(); JOptionPane.showMessageDialog(TelFrame.this,

40、 e1 . getMessage(); sendText.setText(null); /清空发送信息 sendText.requestFocus(); ,49,思考与习题,请简述基于TCP编程的步骤,并举例 请简述基于UDP编程的步骤,并举例 编程实现:将客户端录入的十个数传入服务器端,计算平均值结果再传给客户端 编程实现:将某个网站的首页内容输出到控制台,Java实用编程技术,50,4 HTTP协议网络编程,URL的组成 protocol:/resourceName 协议名(protocol)指明获取资源所使用的传输协议,如http、ftp、gopher、file等, 资源名(resour

41、ceName)则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。 如:,51,4 HTTP协议网络编程,为了表示URL,中实现了类URL。我们可以通过下面的构造方法来初始化一个URL对象: (1)public URL (String spec); 通过一个表示URL地址的字符串可以构造一个URL对象。 URL urlBase=new URL(http:/www. (2)public URL(URL context, String spec); 通过基URL和相对URL构造一个URL对象。 URL net263=new URL ( URL index263=new URL(net263, index.html),52,4 HTTP协议网

温馨提示

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

评论

0/150

提交评论