当前位置:首页 > 网赚杂谈 > 正文

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

前言

Java 网络编程,首先介绍了一些网络方面的基本知识。重点介绍了JSON 数据交换格式,由于 Java 官方没有提供 JSON 解码和编码库,需要使用第三方库。使用方法 URL 访问互联网资源。

网络编程是非常重要的技术。Java SE 提供 java.net 包,其中包含了网络编程所需要的最基础的一些类和接口。这些类型和接口面向两个不同的层次:基于 Socket 低层次网络编程和基于 URL 的高层次网络编程,所谓高低层次就是通信协议议的高低底层次,Socket 采用 TCP、UDP 等协议,这些协议属于低层次的通信协议;URL采用 HTTP 和 HTTPS 这些属于高层次的通信协议。低层次网络编程,因为它面向底层,所以虽然复杂,但是“低层次网络编程”并不等于它功能不强大。恰恰相反,正因为层次低,Socket编程与基于URL的高层次网络编程比较,能够提供更强大的功能和更灵活的控制,但是要更复杂一些。

网络基础

网络编程需要程序员掌握一下基础的网络知识,这一节先介绍一些网络基础知识。

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

网络结构

首先了解一下网络结构,网络结构是网络的构建方式,目前流行的有客户端服务器结构网络和对等结构网络。

1. 客户端服务器结构网络

客户端服务器(Client Server,缩写 C/S)结构网络,是一种主从结构网络。如图 17-1 所示,服务器一般处于等待状态,如果有客户端请求,服务器响应请求建立连接提供服务。服务器是被动的,有点像在餐厅吃饭时候的服务员。而客户端是主动的,像在餐厅吃饭的顾客。

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

事实上,生活中很多网络服务都采用这种结构。例如:Web 服务、文件传输服务和邮件服务等。虽然它们存在的目的不一样,但基本结构是一样的。这种网络结构与设备类型无关,服务器不一定是电脑,也可能是手机等移动设备。

2. 对等结构网络

对等结构网络也叫点对点网络(Peer to Peer,缩写 P2P),每个节点之间是对等的。它们如图 17-2 所示,每个节点既是服务器又是客户端,这种结构有点像吃自助餐。

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

对等结构网络分布范围比较小。通常在一间办公室或一个家庭内,因此它非常适合于移动设备间的网络通讯,网络链路层是由蓝牙和 WiFi 实现。

TCP/IP 协议

网络通信会用到协议,其中 TCP/IP 协议是非常重要的。TCP/IP 协议是由 IP 和 TCP 两个协议构成的,IP(Internet Protocol)协议是一种低级的路由协议,它将数据拆分成许多小的数据包中,并通过网络将它们发送到某一特定地址,但无法保证都所有包都抵达目的地,也不能保证包的顺序。

由于 IP 协议传输数据的不安全性,在网络通信时还需要 TCP 协议,传输控制协议(Transmission Control Protocol,TCP)是一种高层次的协议,面向连接的可靠数据传输协议议,如果有些数据包没有收到会重发,并对数据包内容准确性检查并保证数据包顺序,所以以该协议保证数据包能够安全地按照发送时顺序送达目的地。

JSON 文档结构

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。所谓轻量级,是与XML 文档结构相比而言的,描述项目的字符少,所以描述相同数据所需的字符个数要少,那么传输速度就会提高,而流量却会减少。

如果留言条采用 JSON 描述,可以设计成下面的样子:

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

由于 Web 和移动平台开发对流量的要求是要尽可能少,对速度的要求是要尽可能快,轻量级的数据交换格式 JSON 就成为理想的数据交换格式。

构成 JSON 文档的两种结构为对象和数组。对象是“名称-值”对集合,它类似于 Java中 Map 类型,而数组是一连串元素的集合。

对象是一个无序的“名称/值”对集合,一个对象以{(左括号)开始,}(右括号)结束。每个“名称”后跟一个:(冒号),“名称-值”之间使用,(逗号)分隔。JSON 对象的语法表如图

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

JSON 对象的语法表

下面是一个 JSON 对象的例子:

{
"name":"a.htm",
"size":345,
"saved":true
}

数组是值得有序集合,以[(左中括号)开始,](右中括号)结束,值之间使用,(逗号)分隔。JSON 数组的语法表如图

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

JSON 数组的语法表

下面是一个 JSON 数组的例子:

["text","html","css"]

在数组中,值可以是双引号括起来的字符串、数值、true、false、null、对象或者数组,而且这些结构可以嵌套。数组中值得 JSON 语法结构如图

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

JSON 值的语法结构图

使用第三方 JSON 库

由于目前 Java 官方没有提供 JSON 编码和解码是所需要的类库,所以需要使用第三方JSON 库,笔者推荐 JSON-java 库,JSON-java 库提供源代码,最重要的是不依赖于其他地方三方库,需要再起找其他的库了。

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

JSON-java 源代码文件

将 JSON-java 库源代码文件添加到工程中,需要两个步骤发布:

需要源码的小伙伴可以转发+点赞+关注 私信【666】获取

1. 创建 org.json 包

JSON-java 库中的源代码文件都隶属于 org.json 包,从图 可见源文件夹下没有与包对应的目录结构,为此需要在 Eclipse 的项目中创建 org.json 包。选择 Eclipse 项目的 src源代码文件夹,右击菜单中选择“新建”→“包”,弹出新建包对话框,如图所示在名称的中输入 org.json,然后单击完成,就成功创建 org.json 包。

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

在 Eclipse 中创建包

2. 复制源代码文件

org.json 包创建好后,需要将 JSON-java 文件夹中的源代码文件复制到 Eclipse 工程的 org.json 包中。由于操作系统的资源管理器与 Eclipse 工具之间互相复制粘贴,Eclipse中复制和粘贴操作的快捷键和右键菜单与操作系统下完全一样。如图 17-10 所示,将源代码文件复制到 Eclipse 中。

基础神文,入门:网络编程,只看这篇文章,网络编程基础知识

复制源代码文件到 Eclipse 工程

JSON 数据编码和解码

JSON 和 XML 真正在进行数据交换的时候,它们存在的形式就是一个很长的字符串,这个字符串在网络中传输或者存储于磁盘等介质中。在传输和存储之前需要把 JSON 对象转换成为字符串才能传输和存储,这个过程称之为“编码”过程。接收方需要将接收到的字符串转换成为 JSON 对象,这个过程称之为“解码”过程。编码和解码过程就像发电报一样发送方把语言变成能够传输的符号,而接收时要将符号转换成为能够看懂的语言。

下面具体介绍一下 JSON 数据编码和解码过程。

1. 编码

如果想获得如下这样 JSON 字符串:

{"name": "tony", "age": 30, "a": [1, 3]}

应该如何实现编码过程,参考代码如下:

try {
JSONObject jsonObject = new JSONObject(); ①
jsonObject.put("name", "tony"); ②
jsonObject.put("age", 30); ③
JSONArray jsonArray = new JSONArray(); ④
jsonArray.put(1).put(3); ⑤
jsonObject.put("a", jsonArray); ⑥
//编码完成
System.out.println(jsonObject.toString()); ⑦
} catch (JSONException e) {
e.printStackTrace();
}

上述代码第①行是创建 JSONObject(JSON 对象),代码第②行和第③行是把 JSON 数据项添加到 JSON 对象 jsonObject 中,代码第④行创建 JSONArray(JSON 数组),代码第⑤行是向 JSON 数组中添加 1 和 3 两个元素。代码第⑥是将 JSON 数组 jsonArray 作为 JSON对象 jsonObject 的数据项添加到 JSON 对象。

代码第⑦行 jsonObject.toString()是将 JSON 对象转换为字符串,真正完成了 JSON 编码过程。

2. 解码

解码过程是编码反向操作,如果有如下 JSON 字符串:

{"name":"tony", "age":30, "a":[1, 3]}

那么如何把握这个 JSON 字符串解码成 JSON 对象或数组,参考代码如下:

String jsonString = "{\"name\":\"tony\", \"age\":30, \"a\":[1, 3]}"; ①
try {
  JSONObject jsonObject = new JSONObject(jsonString); ②
	String name = jsonObject.getString("name"); ③
	System.out.println("name : " + name);
	int age = jsonObject.getInt("age");
	System.out.println("age : " + age);
	JSONArray jsonArray = jsonObject.getJSONArray("a"); ④
	int n1 = jsonArray.getInt(0); ⑤
	System.out.println("数组a第一个元素 : " + n1);
	int n2 = jsonArray.getInt(1);
	System.out.println("数组a第二个元素 : " + n2);
} catch (JSONException e) {
		e.printStackTrace();
}

上述代码第①行是声明一个 JSON 字符串,网络通信过程中 JSON 字符串是从服务器返回的。代码第②行通过 JSON 字符串创建 JSON 对象,这个过程事实上就是 JSON 字符串解析过程,如果能够成功地创建 JSON 对象,说明解析成功,如果发生异常则说明解析失败。

代码第③行从 JSON 对象中按照名称取出 JSON 中对应的数据。代码第④行是取出一个 JSON 数组对象,代码第⑤行取出 JSON 数组第一个元素。

有话要说...