网络连接的几个例子
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();
}
}
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();
}