[关闭]
@nextleaf 2018-08-27T23:05:32.000000Z 字数 4963 阅读 865

2018-08-27 工作日志

工作日志 Java XML 网络编程


上午

Java网络编程

  1. package com.nl.sx823.networkprogram.socket.udp;
  2. import org.junit.Test;
  3. import java.io.IOException;
  4. import java.net.DatagramPacket;
  5. import java.net.DatagramSocket;
  6. import java.net.InetAddress;
  7. import java.net.SocketException;
  8. /**
  9. * @author: 黄昭鸿
  10. * @date: 2018-08-27
  11. * Time: 9:16
  12. */
  13. public class TestUDP {
  14. @Test
  15. public void client() {
  16. byte[] chars = "The Data".getBytes();
  17. DatagramSocket dgs = null;
  18. try {
  19. dgs = new DatagramSocket();
  20. DatagramPacket dgp = new DatagramPacket(chars, 0, chars.length, InetAddress.getByName("127.0.0.1"), 9090);
  21. dgs.send(dgp);
  22. } catch (SocketException e) {
  23. e.printStackTrace();
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. dgs.close();
  28. }
  29. @Test
  30. public void server(){
  31. try {
  32. byte[] bytes=new byte[8];
  33. DatagramSocket datagramSocket = new DatagramSocket(9090);
  34. DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length);
  35. datagramSocket.receive(datagramPacket);
  36. System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
  37. datagramSocket.close();
  38. } catch (SocketException e) {
  39. e.printStackTrace();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }

TCP与UDP基本区别

1.基于连接与无连接
2.TCP要求系统资源较多,UDP较少;
3.UDP程序结构较简单
4.流模式(TCP)与数据报模式(UDP);
5.TCP保证数据正确性,UDP可能丢包
6.TCP保证数据顺序,UDP不保证

TCP与UDP区别总结:

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

XML

XML 指可扩展标记语言(EXtensible Markup Language)
XML 被设计用来传输和存储数据。
XML 是 W3C 的推荐标准

XML语法

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 单引号
&quot; " 引号

例子:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!--XML声明不属于XML本身的组成部分。它不是 XML 元素,也不需要关闭标签-->
  3. <root>
  4. <child>
  5. <subchild>.....</subchild>
  6. </child>
  7. </root>

下午

XML文档解析

DMO文档对象模型(拉模型)

文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。DOM将 XML 文档作为一个树形结构,而树叶被定义为节点。

XML DOM

XML DOM 是用于获取、更改、添加或删除 XML 元素的标准。

节点

整个文档是一个文档节点
每个 XML 标签是一个元素节点
包含在 XML 元素中的文本是文本节点
每一个 XML 属性是一个属性节点
注释属于注释节点

节点操作

DOM 获取节点
DOM 改变节点
DOM 删除节点
DOM 替换节点
DOM 创建节点
DOM 添加节点
DOM 克隆节点

XML DOM原生遍历

  1. public static void testDOM() {
  2. //创建一个DocumentBuilderFactory的对象
  3. DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
  4. //创建一个DocumentBuilder的对象
  5. try {
  6. //创建DocumentBuilder对象
  7. DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
  8. //通过DocumentBuilder对象的parser方法加载books.xml文件到当前项目下
  9. Document document = documentBuilder.parse("src/com/nl/sx827/xml/xml.xml");
  10. //获取所有book节点的集合
  11. NodeList bookList = document.getElementsByTagName("book");
  12. //通过nodelist的getLength()方法可以获取bookList的长度
  13. System.out.println("一共有" + bookList.getLength() + "本书");
  14. //遍历每一个book节点
  15. for (int i = 0; i < bookList.getLength(); i++) {
  16. System.out.println("=================下面开始遍历第" + (i + 1) + "本书的内容=================");
  17. //通过 item(i)方法 获取一个book节点,nodelist的索引值从0开始
  18. Node book = bookList.item(i);
  19. //获取book节点的所有属性集合
  20. NamedNodeMap attrs = book.getAttributes();
  21. System.out.println("第 " + (i + 1) + "本书共有" + attrs.getLength() + "个属性");
  22. //遍历book的属性
  23. for (int j = 0; j < attrs.getLength(); j++) {
  24. //通过item(index)方法获取book节点的某一个属性
  25. Node attr = attrs.item(j);
  26. //获取属性名
  27. System.out.print("属性名:" + attr.getNodeName());
  28. //获取属性值
  29. System.out.println("--属性值" + attr.getNodeValue());
  30. }
  31. //解析book节点的子节点
  32. NodeList childNodes = book.getChildNodes();
  33. //遍历childNodes获取每个节点的节点名和节点值
  34. System.out.println("第" + (i + 1) + "本书共有" + childNodes.getLength() + "个子节点");
  35. for (int k = 0; k < childNodes.getLength(); k++) {
  36. //区分出text类型的node以及element类型的node
  37. if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
  38. //获取了element类型节点的节点名
  39. System.out.print("第" + (k + 1) + "个节点的节点名:" + childNodes.item(k).getNodeName());
  40. //获取了element类型节点的节点值
  41. System.out.println("--节点值是:" + childNodes.item(k).getFirstChild().getNodeValue());
  42. //System.out.println("--节点值是:" + childNodes.item(k).getTextContent());
  43. }
  44. }
  45. System.out.println("======================结束遍历第" + (i + 1) + "本书的内容=================");
  46. }
  47. } catch (ParserConfigurationException e) {
  48. e.printStackTrace();
  49. } catch (SAXException e) {
  50. e.printStackTrace();
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. }

SAX事件驱动推模型

SAX解析的步骤可分为以下四个步骤

  1. 得到xml文件对应的资源,可以是xml的输入流,文件和uri
  2. 得到SAX解析工厂(SAXParserFactory)
  3. 由解析工厂生产一个SAX解析器(SAXParser)
  4. 传入输入流和handler给解析器,调用parse()解析

使用dom4j读取XML文件

JDOM是XML的独特 Java 工具包,DOM4J是JDOM的升级版,JDOM底层还是使用SAX、DOM

  1. public static void testDOM4J() {
  2. try {
  3. File file = new File("src/com/nl/sx827/xml/xml.xml");
  4. SAXReader reader = new SAXReader();
  5. org.dom4j.Document document = reader.read(file);
  6. System.out.println(document.asXML());
  7. } catch (DocumentException e) {
  8. e.printStackTrace();
  9. }
  10. }

DOM与SAX的区别

一、DOM:拉模型,把整个文档加载到内存中

优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;
缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;
使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)

二、SAX:推模型,事件驱动编程,基于回调SAX ,事件驱动。

当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。

优点:不用事先调入整个文档,占用资源少;
缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;

使用场合:数据量较大的XML文档,占用内存高,机器内存少,无法一次加载XML到内存;只需XML文档的少量内容,很少回头访问;

HTML标签

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注