15/8/3/网络连接,UDP,DOM,SAX,JSON

网络连接的几个例子

UDP

DOM

SAX

JSON

读取网页的xml文本

    public static void main(String[] args) {
        try {
            URL url=new URL("http://www.baidu.com");//根据 String 表示形式创建 URL 对象
            InputStream is=url.openStream();//打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream
            BufferedReader br=new BufferedReader(new InputStreamReader(is));//建立缓冲流
            String line=br.readLine();//读一行
            while(line!=null){
                System.out.println(line);
                line=br.readLine();//读下一行
            }
            br.close();
            is.close();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
读取指定地址的图片并放在指定位置上

//  将一副图片(无论是什么格式的)写入一个文件中
    public static void main(String[] args) {
        try {
//          根据 String 表示形式创建 URL 对象//类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针
//          URL url=new URL("http://imgsrc.baidu.com/baike/pic/item/7af40ad162d9f2d339d2a789abec8a136227cc91.gif");
            URL url=new URL("http://g.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=4ad7bfb61bd8bc3ec65d0eceb7bb8a28/b3119313b07eca80436e336b932397dda04483d6.jpg");
//          URL url=new URL("http://music.baidu.com/song/14945107/download?__o=%2Fsong%2F14945107#rate=1000");
            File fileGif=new File("e:\\喵喵.gif");
            if (!fileGif.exists()) {//判断时候存在文件,如果没有就创建
                fileGif.createNewFile();
            }
            OutputStream os=new FileOutputStream(fileGif);
            InputStream is=url.openStream();
            byte[] arry=new byte[1024];//字节缓冲区
            int i=is.read(arry);//读字节
            while(i!=-1){//判断是否结束
                os.write(arry, 0, i);//将字节流写入文件
                i=is.read(arry);//继续往下读
            }
            os.flush();//冲刷
            os.close();//关闭
            is.close();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


1.UDP协议(User Datagram Protocol)即:用户数据包协议,是一种不可靠的网络协议,它在通信示例的两端各建立一个Socket,但是这两个Socket之间没有虚拟连接,这两个Socket具有发送和接受数据包的对象
2.UDP协议的主要作用是完成网络数据流量和数据包之间的链接转换
3.信息的发送端,UDP协议将网络数据流量封装成数据包,然后将数据包发送出去。
4.信息的接受端,UDP协议将数据包接受后转换成实际数据内容。

UDP和TCP的对比

1.TCP协议:可靠,传输数据包的大小没有限制,但是需要连接建立时间,差错控制的开销大
2.UDP协议:不可靠,差错控制开销小,传输数据包大小有限制(64K以下)而且不需要建立连接

UDP的例子

    public static void main(String[] args) {
        try {
            DatagramSocket send=new DatagramSocket();//利用计算机闲置端口将数据发送出去
            String s="你好,我要发送给您一条信息";//发送的字符
            byte[] array=s.getBytes();//将字符更改为字符流
//           构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
            DatagramPacket packet=new DatagramPacket(array, array.length,InetAddress.getLocalHost(),8080);
            System.out.println("开始发送数据");
            send.send(packet);//从此套接字发送数据报包
            send.close();//关闭send流
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        try {
            DatagramSocket receiver=new DatagramSocket(8080);//创建数据报套接字并将其绑定到本地主机上的指定端口
            byte[] array=new byte[1024];//构建发送数据流长度,不能超过64k
            DatagramPacket packet=new DatagramPacket(array, array.length);//构造 DatagramPacket,用来接收长度为 length 的数据包
            receiver.receive(packet);//从此套接字接收数据报包
            byte[] data=packet.getData();//返回数据缓冲区
            System.out.println("接收到的数据\n"+(new String (data)));
            receiver.close();
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }



    public static void main(String[] args) {
        try {
            DatagramSocket receiver = new DatagramSocket(8088);//创建数据报套接字并将其绑定到本地主机上的指定端口
            byte[] ReceiverArray = new byte[1024];//构建发送数据流长度,不能超过64k

            DatagramSocket send = new DatagramSocket();//利用计算机闲置端口将数据发送出去
            //String s="你好,我要发送给您一条信息";//发送的字符
            while (true) {
                System.out.println("Send端发送的数据为:");
                Scanner scanner = new Scanner(System.in);
                String SendString = scanner.next();
                byte[] array = SendString.getBytes();//将字符更改为字符流
                //构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
                DatagramPacket packet = new DatagramPacket(array, array.length, InetAddress.getByName("192.168.0.111"),8080);
                send.send(packet);//从此套接字发送数据报包
                //以上为发送数据段
                //以下我接受数据
                DatagramPacket ReceiverPacket = new DatagramPacket(ReceiverArray, ReceiverArray.length);//构造 DatagramPacket,用来接收长度为 length 的数据包
                receiver.receive(ReceiverPacket);//从此套接字接收数据报包
                byte[] data = ReceiverPacket.getData();//返回数据缓冲区
                //注意是包的长度,如果写的是数组的长度就会发生字节数组清空不了的情况
                //System.out.println("Send端接收到的数据:" + new String(data,0,data.length));//字节数组清空不了,导致有重复内容发送
                System.out.println("Send端接收到的数据:" + new String(data, 0, ReceiverPacket.getLength()));

            }
            //send.close();//关闭send流
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }



    public static void main(String[] args) {
        try {
            DatagramSocket receiver = new DatagramSocket(8080);//创建数据报套接字并将其绑定到本地主机上的指定端口
            byte[] array = new byte[1024];//构建发送数据流长度,不能超过64k

            DatagramSocket send = new DatagramSocket();//利用计算机闲置端口将数据发送出去
            while (true) {

                DatagramPacket packet = new DatagramPacket(array, 1024);//构造 DatagramPacket,用来接收长度为 length 的数据包
                receiver.receive(packet);//从此套接字接收数据报包
                byte[] data = packet.getData();//返回数据缓冲区
                System.out.println("Receiver端接收到的数据:" + new String(data,0,packet.getLength()));
                //以上为接受端接受数据
                //以下为发送端发送数据
                System.out.println("Receiver端发送的数据:");
                Scanner scanner = new Scanner(System.in);
                String ReceiverString = scanner.next();
                byte[] SendArray = ReceiverString.getBytes();//将字符更改为字符流
                //构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
                DatagramPacket SendPacket = new DatagramPacket(SendArray, SendArray.length, InetAddress.getLocalHost(), 8088);
                send.send(SendPacket);//从此套接字发送数据报包
            }
            //receiver.close();
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

DOM解析例子

    public static void main(String[] args) {
        DocumentBuilderFactory facroyt=DocumentBuilderFactory.newInstance();//创建dom解析器的工厂
        DocumentBuilder bulider;
        try {
            bulider = facroyt.newDocumentBuilder();//使用解析器工厂创建解析器
            Document document= bulider.parse("d:\\11.txt");//使用解析器解析文档生成倒树的document
            NodeList list=document.getElementsByTagName("Weather");//得到文档中的所有Weather标签
            Node node=list.item(0);//得到第一个Weather标签
            Node child=node.getFirstChild();//得到Weather标签的第一个子标签city
            Node next=child.getNextSibling();//得到city的下一个标签
            while(next!=null){//判断有没有走到最后一个标签
                if (next.getNodeType()==Node.ELEMENT_NODE) {//判断节点类型是ELEMENT_NODE
                    Node content=next.getFirstChild();//得到该节点的第一个子节点不能为空
                    if (content!=null) {
                        System.out.println(next.getFirstChild().getNodeValue().trim());//STring 中有一个方法叫trim去掉前后空格

                    }
                }
                next =next.getNextSibling();//得到下一个标签
            }
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

SAX解析例子
public class MySAXHandler extends DefaultHandler{
    private boolean isArrive=false;
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {

        super.characters(ch, start, length);//接收元素中字符数据的通知
        if (isArrive) {
            System.out.println("我终于查到这个scz的值了"+new String(ch,start,length));        
        }
    }
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("解析文档结束");//接收文档结束的通知
    }
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        System.out.println(localName+"标签结束"+qName);// 接收元素结束的通知
        isArrive=false;
    }
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        System.out.println("解析文档开始");//接收文档开始的通知
    }
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        isArrive=qName.equals("xcz");
        System.out.println(localName+"标签开始"+qName);// 接收元素开始的通知
    }
}

    public static void main(String[] args) {
//      定义工厂 API,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档
        SAXParserFactory factory=SAXParserFactory.newInstance();
        try {
            SAXParser parser=factory.newSAXParser();//使用当前配置的工厂参数创建 SAXParser 的一个新实例
            MySAXHandler handler=new MySAXHandler();
            parser.parse(new File("d:\\11.txt"), handler);//使用指定的 DefaultHandler 将指定文件的内容解析为 XML
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

JSON解析例子

    public static void main(String[] args) {
        String json=creatJSON();
        JSONObject obj=JSONObject.fromObject(json);//将输入的数据格式化为JSON格式进行显示
        System.out.println(obj.getString("city"));//打印key为"city"中的value值
        JSONObject today=obj.getJSONObject("today");
        JSONArray array=today.getJSONArray("index");
        for (int i = 0; i < array.size(); i++) {
            JSONObject obj1=array.getJSONObject(i);
            System.out.println(obj1.getString("name"));

        }
    }
    private static String creatJSON(){
        JSONObject obj=new JSONObject();//定义一个JSONObject对象
        obj.put("city", "北京");//向对象中添加元素
        obj.put("cityid", "001");
        JSONObject today=new JSONObject();
        today.put("date", "2015-08-03");
        today.put("week", "星期一");
        JSONArray array=new JSONArray();
        JSONObject index1=new JSONObject();
        index1.put("name", "感冒");
        JSONObject index2=new JSONObject();
        index2.put("name", "防晒");
        JSONObject index3=new JSONObject();
        index3.put("name", "炎热");
        array.add(index1);
        array.add(index2);
        array.add(index3);
        today.put("index", array);
        obj.put("today", today);
        System.out.println(obj.toString());
        return obj.toString();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值