网络编程(network programming)
1、何为网络遍程
1.1 网络编程是网站、网页编程的底层基础,但与他们不相等、不同。
网络编程,对于高级开发语言面言,多是指基于socket的编程,
也就是面向tcp/udp的编程。
而网页编程,多是面向http协议编程。它是以网络编程为底层基础的。
通过网络编程的参考模型可知。
1.2 网络互联参考模型
1.2.1 学术界的参考模型OSI:open system interconnection
7层:从底向上为:
物理层:封装的底层电气、机械特性,即0、1传输,以bit为单位
数据链路层:是对0、1等最基本单位的封装,成为各种传输单元。
网络层:将下层封装起来的数据单元从src终端传到dst终端。这里只是说计算机之间的到达,即端到端的传输。
传输层:上边是端到端,即机器到机器。该处即为机器内的进程到机器内的进程的传输。
即是tcp/udp编程的所在层。
会话层:维持网络联接的开始、中断、重启。
表示层:为应用层提供加解密、解码等操作。
应用层:如http、ftp、smtp等协议集中在此。像大数数的应用编程多集于此层开发。
工业界的实际参考模型Tcp/IP:tcp and ip protocol group
4层:从底向上:
osi的第1、2层合成该层:
网络层:
传输层:
osi的第5、6、7层合成该层:
1.2.2 启示
分层的设计架构:到目前也是无处不在,是最主流的解决复杂网络、软件设计等问题的方案,即分层的设计思路。
包括nutch、hadoop、lucene、spark等等均是在不断的分层过程中逐渐发展壮大的。
以及现在java web设计之最流行的MVC,model-view-control,即是经典的分层。
启示结果:解析复杂问题的最有效方法,即是分层架构设计。
1.3 tcp、udp优缺点
tcp:面向链接、可靠的数据传输,
主要在于三次握手,最后有4次握手释放链接。
效率相对低。
应用场景:讲究可靠、有序性,像打电话、QQ聊天、浏览器浏览网页等。
相对来说tcp的应用范围更广。
udp:面向无链接,不可靠的数据传输。
效率相对高。
应用场景:对可靠性要求不高的情况,像语音聊天、游戏场景(war3)等等。
2、难点
2.1 多线程编程
多线程的同步处理
2.2 高效率
并发一高,会导致通讯变慢等情况。
解决这一问题,可以通过java nio编程,即非阻塞方式,即通道channel和选择器selector来搞定。
3、重点
3.1 网络io流的熟练掌握
网络编程,关键就是数据流的传输,故io流要熟练。
3.2 java socket编程api熟练掌握
网络编程的核心包即java.net包,重要api均在此。
4、实战项目
4.1 类QQ群的网络聊天室
4.1.1 面向对象分析:
(1)socket server
(2)socket client,分两个client。
第1个client,是用户端的client。
第2个client,是服务器的client,是服务器端为了接收与响应客户端的client来初始化工作。
(3)守护线程 daemone thread
(4)系统启动器,即controler部分
(5)业务管理器,即manager部分
(6)数据解析类,即发送或接收到的数据的解析
4.2 功能模块划分
(1) 用户端之客户端
* 通过读取console端输入的数据,写给服务器端socket server。
* 读取socket server发过来的消息,构成实际的网络聊天室。
ps: 以上两点要并行执行,即要产生两个线程
(2) 服务器端,做接受和分发客户端
* 通过socket server的accept方法,接受user client,并初始化一个
server端的client与之对应。完成双方的socket读写。
* 读取服务器的console输入,即服务器端要给客户端的消息,并通过守护线程实际写给各user client
(3) 服务器端之客户端
* 读取user client的信息,给服务器的消息管理器。最后由守护线程来完成真正的分发。
* 读取服务器端要写给user client的消息,最终通过持有的user client socket的写入流将数据
写给user client端。
统一用语:
用户端的客户端:user client
服务器的客户端:server client
服务器本身: socket server
4.3 类QQ的聊天器。
经过聊天室的程序改造,即可完成该任务。
些任务留做各位同学的课后作业吧,有兴趣的一定要亲自去改改。