Java学习笔记(3)网络通信

1、Java中的XML操作


有关XML的简介请点击:XML学习笔记


使用Dom4j操作XML数据:

首先在https://dom4j.github.io/点击下在dom4j-1.6.1 java库。导入到java工程中调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package java网络通信;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.xml.sax.DocumentHandler;

public class Dom4j创建xml {
public static void main(String[] args) {
String xmlString = "<root><people>cao</people></root>";
try {
Document document = DocumentHelper.parseText(xmlString);
System.out.println(document.asXML());

} catch (DocumentException e) {
e.printStackTrace();
}
}
}

程序执行结果:

1
2
<?xml version="1.0" encoding="UTF-8"?>
<root><people>cao</people></root>

在Java中创建xml数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package java网络通信;
import java.io.File;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.events.DocumentEvent;

public class 创建xml文件 {
public static void main(String[] args) {

//Java中常用的通过DOM方式生成xml文档
try {
//创建xml文件
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
//创建根元素root
org.w3c.dom.Element root = document.createElement("Languages");
//创建第一组元素
root.setAttribute("cat", "it");//为根元素添加属性
org.w3c.dom.Element lan1 = document.createElement("lan");
lan1.setAttribute("id", "1");
org.w3c.dom.Element name1 = document.createElement("name");
name1.setTextContent("Java");
org.w3c.dom.Element ide1 = document.createElement("ide");
ide1.setTextContent("eclipse");
lan1.appendChild(name1); //把<name>标签添加到<lan>里。作为子节点
lan1.appendChild(ide1);
//创建第二组元素
org.w3c.dom.Element lan2 = document.createElement("lan");
lan2.setAttribute("id", "2");
org.w3c.dom.Element name2 = document.createElement("name");
name2.setTextContent("Swift");
org.w3c.dom.Element ide2 = document.createElement("ide");
ide2.setTextContent("Xcode");
lan2.appendChild(name2);
lan2.appendChild(ide2);
//创建第三组元素
org.w3c.dom.Element lan3 = document.createElement("lan");
lan3.setAttribute("id", "1");
org.w3c.dom.Element name3 = document.createElement("name");
name3.setTextContent("C#");
org.w3c.dom.Element ide3 = document.createElement("ide");
ide3.setTextContent("Visual Studio");
lan3.appendChild(name3);
lan3.appendChild(ide3);
//最后用根元素包围所有元素
root.appendChild(lan1);
root.appendChild(lan2);
root.appendChild(lan3);
document.appendChild(root);

//xml文件的输出
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
StringWriter writer = new StringWriter(); //定义存放数据的变量writer
//以输入字符串的方式输出文本
transformer.transform(new DOMSource(document), new StreamResult(writer));
System.out.println(writer);

//输出xml文件
transformer.transform(new DOMSource(document),new StreamResult(new File("xml文件")));

} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}

输出的xml文本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Languages cat="it">
<lan id="1"
<name>Java</name>
<ide>eclipse</ide>
</lan>
<lan id="2">
<name>Swift</name>
<ide>Xcode</ide>
</lan><lan id="1">
<name>C#</name>
<ide>Visual Studio</ide>
</lan>
</Languages>

2、Java中的JSON操作:


有关JSON的简介请点击:JSON学习笔记


在Java中创建JSON文件:

首先可以在http://vdisk.weibo.com/s/9emUo下载google-gson-2.2.4 Java库,然后导入到Java工程中调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package java网络通信;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

public class 创建JSON文件 {

public static void main(String[] args) {
//创建一个目标文件
JsonObject object = new JsonObject();
object.addProperty("cat", "it");//添加目标属性
//创建JOSN数组
JsonArray array = new JsonArray();
//创建第一个数组元素
JsonObject lan1 = new JsonObject();
lan1.addProperty("id", 1);
lan1.addProperty("name", "Java");
lan1.addProperty("ide", "Eclipse");
array.add(lan1);
//创建第一个数组元素
JsonObject lan2 = new JsonObject();
lan2.addProperty("id", 2);
lan2.addProperty("name", "Swift");
lan2.addProperty("ide", "Xcode");
array.add(lan2);
//创建第一个数组元素
JsonObject lan3 = new JsonObject();
lan3.addProperty("id", 3);
lan3.addProperty("name", "C#");
lan3.addProperty("ide", "Visual Studio");
array.add(lan3);
//包装数组
object.add("languages", array);
object.addProperty("pop", true);
//输出josn文本
System.out.println(object.toString());
}
}

输出的JSON文本:

1
2
3
4
5
6
7
8
9
{
"cat":"it",
"languages":[
{"id":1,"name":"Java","ide":"Eclipse"},
{"id":2,"name":"Swift","ide":"Xcode"},
{"id":3,"name":"C#","ide":"Visual Studio"}
],
"pop":true
}

在Java中读取JSON文本:

通过Java读取上面输出的文本文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package java网络通信;

import java.io.FileNotFoundException;
import java.io.FileReader;

import com.google.gson.JsonArray;
import com.google.gson.JsonIOException;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;

public class 读取JSON文本 {

public static void main(String[] args) {
try {
//创建JSON解析器,用于解析json文档
JsonParser parser = new JsonParser();
JsonObject object = (JsonObject) parser.parse(new FileReader("json.json"));
System.out.println("cat="+ object.get("cat").getAsString());
System.out.println("pop="+ object.get("pop").getAsBoolean());

JsonArray array = object.get("languages").getAsJsonArray();
for (int i = 0; i < array.size(); i++) {
System.out.println("-------------");
JsonObject subObject = array.get(i).getAsJsonObject();
System.out.println("id=" + subObject.get("id").getAsInt());
System.out.println("name=" + subObject.get("name").getAsString());
System.out.println("ide=" + subObject.get("ide").getAsString());
}

} catch (JsonIOException e) {
e.printStackTrace();
} catch (JsonSyntaxException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

程序运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat=it
pop=true
-------------
id=1
name=Java
ide=Eclipse
-------------
id=2
name=Swift
ide=Xcode
-------------
id=3
name=C#
ide=Visual Studio

3、Java中的HTTP通信


使用 Http 的 Get 方式读取网络数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package java网络通信;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.omg.CORBA.portable.InputStream;
import java基础.stringBuffer;

public class 读取网络数据 {

public static void main(String[] args) {
try {
//获取百度首页信息
URL url = new URL("https://www.baidu.com/");
URLConnection connection = url.openConnection();
//把获取的信息转换位输入流
java.io.InputStream is = connection.getInputStream();
//读取输入流,并指定编码格式为“UTF-8”
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
//读取数据缓存区
BufferedReader br = new BufferedReader(isr);

String line;//定义数据存放位置
StringBuilder builder = new StringBuilder();
while ((line = br.readLine())!= null) {
builder.append(line);
}
br.close();
isr.close();
is.close();
//打印数据
System.out.println(builder.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

使用HttpClient进行Get方式通信:

先从http://hc.apache.org/downloads.cgi下载httpcomponents库,导入到java工程中使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package java网络通信;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class 使用HttpClient进行Get方式通信 {

public static void main(String[] args) {
new Get().start();
}
}
class Get extends Thread{
HttpClient client = HttpClients.createDefault();
public void run() {
HttpGet get = new HttpGet("http://www.baidu.com");
try {
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();//实用工具
String string = EntityUtils.toString(entity,"UTF-8");
System.out.println(string);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

4、Java中的Socket通信


Socket介绍:

Socket又称为“套接字”,英语程序通常通过“套接字”向网络发出请求或者应答网络请求。

对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket。服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了。首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信。这样就有两个Socket了,客户端和服务端各一个。

​ 对于Socket之间的通信其实很简单,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。

Socket链接的建立过程:

  1. 服务器监听。
  2. 客户端发出请求。
  3. 建立链接。
  4. 通信。

Socket特点:

  1. Socket基于TCP链接,数据传输有保障。
  2. Socket适用于建立长时间链接。
  3. Socket编程通常用于即时通信。

有关Socket的更多介绍请点击:基础socket—简单聊天室的实现。

ServerSocket的建立与使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package java网络通信;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;

public class ServerSocket的创建与使用 {
public static void main(String[] args) {
try {
//端口范围1-65535
ServerSocket serverSocket = new ServerSocket(12345);
//block,监听本地12345端口
Socket socket = serverSocket.accept();
//建立连接
JOptionPane.showMessageDialog(null, "有客户端链接到本地的12345端口");
} catch (IOException e) {
e.printStackTrace();
}
}
}

坚持原创技术分享,您的支持将鼓励我继续创作!