这是张富涛的第6篇原创
网络编程:网络编程模型
1. 写在前面
无论TCP还是UDP的网络编程,都是由服务器端和客户端组成,当然,如果B/S结构(类似Web开发)则只需要实现服务器端即可,所以介绍网络编程时,我们以C/S结构为基础进行介绍。
2. 客户端网络编程模型
客户端(Client)一般为发起连接的程序,编程时一般由以下三个步骤实现:
-
建立网络连接:
与服务器端建立起网络连接,建立时需要指定服务器端的ip地址以及端口号,建立完成后,即可进行网络通信。
-
交换数据:
建立成功连接之后即可进行数据交换,交换时需按照“客户端发出一条请求,服务器端响应一条请求,客户端不发送请求则服务器端不响应”的形式进行。
(一般“交换”数据这个步骤可能会重复进行,而这种操作又是耗时操作,所以一般会单独建立线程进行网络通讯)
-
关闭网络连接:
数据交换完毕后,则关闭网络连接,释放占用端口及内存等系统资源。
3. 服务器端网络编程模型
服务器端(Server)指网络编程中被动等待连接的程序,由于服务器端一般实现核心逻辑及算法以及数据存储等业务,所以编程步骤与客户端不同。大致分为四个步骤:
-
监听端口:
服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的ip地址就是要监听的ip地址。
-
获得连接:
一般客户端对这个服务器端发起并连接时,服务器端可以获取到这个连接,这个连接包括客户端的ip地址等信息,这个连接可以用其进行数据交换。
(一般每一个连接进行数据交换需要一个单独的线程进行处理)
-
数据交换
服务器端通过获得到的连接进行数据交换,首先是获得到客户端传送来的数据,然后进行逻辑处理(业务处理等核心算法或数据存储等)再将处理之后的结果(或其他需要客户端知道的信息)发送给客户端。(接收之后再发送这个步骤与客户端交换数据的步骤不同。)
(对于“数据交换”这个步骤,由于是耗时操作,我们一般新建一个线程单独处理)
-
关闭连接
当服务器端需要关闭,不再接收任何客户端的连接时,我们需要关闭连接,释放服务器端监控的端口及占用的内存等系统资源。
服务器端的开发逻辑就像我们打电话致电客服,电话号码就是我们服务器端监控的端口号,当我们每有一个电话打进来时,我们就要分配一位客服与其进行通信,这个过程就是新建一个线程。
这就是服务器端的编程模型,只是TCP方式是需要建立连接的,对于服务器端的压力比较大,而UDP是不需要建立连接的,对于服务器端的压力比较小罢了。
4. 一个基础的网络类
在进入TCP编程之前,我们先介绍一个基础的网络类:InetAddress
通过它的字面意思,我们尝试着猜测它可能代表一个网络上的地址,下面通过代码演示它的基本功能和用法:
(Java对于网络编程的相关类都放在了java.net包下,InetAddress也不例外)
运行Main函数的执行结果为:
由于这段代码包含了“万方数据知识服务平台”的网络地址,所以执行时需要联网,Try、catch捕获了如果不联网时出现的异常。
这个类是一个基础的网络类,但是这个类不是必须的,在我们进行连接时也可以使用“ip+端口号”的字符串形式替代。
回到我们这个Demo代码中,我们看到 InetAddress.getByName() 这个方法我们只需要将一个域名(www.wanfangdata.com.cn)传递进去即可获取到这个域名对应的公网ip地址,在Java语言中,对于网络编程实现了较好的支持,包括我们客户端模型的“建立连接”步骤,由于Java的高度封装,我们只需要指定ip地址和端口号就可以了。正是因为这种高度封装,使得我们使用Java进行网络编程时,对于网络底层的编程变得很困难,但是也正因为这种封装使得我们用Java进行网络编程时极为便利,这也是Java语言进行网络编程很受欢迎的原因之一,这正所谓“成也萧何,败也萧何”!
小伙伴们请仔细理解客户端及服务器端的模型及逻辑顺序,我们将在下一篇进入实战!
---------------
公众号:张富涛的学习笔记(ID:futaoNT)
知乎:张富涛
CSDN:张富涛
B站:你给的宝物
这是一个在夜晚可以靠编程拯救世界的程序员,关注他将在第一时间获悉他的知识、工作心得!
长按下图二维码关注: