网络通信初体验
网络通信 - 我最开始的理解就是通过网络来进行数据通信。那什么是网络呢?最近通过学习一个即时聊天程序,让我对网络通信有了更深入一点的了解。
网络,就是计算机之间的各种协议,从最底层到最上层是:物理层-》数据链路层 -》网络层 -》传输层 -》应用层,每一次都有相应的协议来规范数据的组装方式和传输过程,整个这些就组成了网络。
在即时聊天程序里,主要用到了socket编程,如果把网络通信比作打电话,socket就是一部手机,你只需要输入对方的电话号码就可以和对方聊天,而如何实现聊天这个信息传输,这就是各种网络协议完成的。
我的Java基础比较薄弱,刚开始deepseek给我生成这个即时聊天程序的所有代码时,我看了半天也没弄明白他们到底是如何通讯的,为什么客户端有主线程和监听线程这两个线程,server主要负责哪些功能,server的handler主要用来干什么的,client, server,handler它们三个到底如何协调工作完成群发信息和私聊功能的。直到我按照deepseek给的建议,一步一步从最简单的socket代码开始写起,一点一点增加功能,到最后把所有的主要功能都实现了,我才豁然开朗。于是我画了下面的一个图来帮助我进一步加深对整个程序的理解
整个流程大致如下
1.启动ServerSocket(8889) 服务器, server.accept()阻塞在这里直到有Client 连接,每 accept 一个客户端,就创建一个新的 Handler 线程
2.Client01连接到server, new Socket(localhost, 8889), 此时server创建一个handler来处理与client的通信-接收客户端发来的信息(Inputstream),并返回数据给客户端(Outputstream)-根据数据类型,调用server的统筹方法,最终调用handler.sendMessage 发送数据给响应的客户端。
3.Client01的主线程通过System.in 读取用户输入的数据,通过 Socket.getOutputStream() 发送给 server 的对应 Handler,Handler 再通过 Server 的统筹方法转发, 同时起一个接收线程不断接收服务器发来的消息(in.readObject)
4. Client02, Client03… 连接到server, 与Client01一样的工作模式,且各个client通过server调度发送群消息或者私聊
(Server 负责管理clients和它们之间的通信,包含的功能包括新用户的增加,去除,广播消息,发送私信给相应的收件人)
也是通过一点一点自己写代码,遇到问题找AI帮忙,之前的哪些疑问才从我心中移去,这页印证了陆游的那句诗“纸上得来终觉浅,绝知此事要躬行”。看别人写的,那永远是别人的知识,只有自己亲身实践,验证并发现问题,这个过程才是自己知识积累的过程。
每一个领域都是一个大大的网络,里面包含各种细分知识,想要理解掌握一个领域的知识,只有一点一点积累,没有捷径。虽然AI可以给你提供答案,但是你自己没有知识储备不一定能看得懂答案。
知其然,知其所以然。借助AI工具,自己亲身去做,去思考,去反馈,去优化。计算机世界很大,我会一步一步进入计算机科学的大门,掌握计算机运行的相关知识。
