基于Socket的网络通信(Java实现)
记录一下计算机网络的作业,顺便就当作Socket编程的一点点入门教程了
首先,你需要了解Socket的本质。
Socket,即套接字,是一种API,底层可以是TCP,UDP等协议,你可以认为Socket是通信的媒介,载体。。。你可以通过Socket获取输入流/输出流(这里的输入和输出都是像Client向Sever输入这种,有着通信含义的输入输出)。
对Socket的介绍就到这了,我感觉介绍到这已经足够了(
接下来介绍一下Socket的核心(我认为),即输入输出(流),毕竟通信离不开输入和输出,即信息的交换。
下面以输入为例,输出和输入没啥区别
输入流分为以下几种(Socket里的)
- InputStream
- InputStreamReader
- BufferedReader
- DataInputStream
总结对比
| 类 | 底层流 | 数据类型 | 缓冲 | 主要用途 |
|---|---|---|---|---|
InputStream | 字节流 | byte | ❌ | 读取二进制数据 |
InputStreamReader | 字节→字符 | char | ❌ | 字节流→字符流(即读取文本) |
BufferedReader | 字符流 | String | ✅ | 高效读取文本(支持readLine()) |
DataInputStream | 字节流 | 结构化数据 | ❌ | 高效读取二进制数据(int、long等) |
因此,显然可以发现在读取文本的时候可以使用BufferedReader,在读取文件的时候更适合使用DataInputStream(当然你可以都用InputStream,不过会比较慢)
下面就给出一些Socket编程的例子,首先是Client与Server之间的文字通信,在这里以“系统时间查询”作为例子。
这里简单说一下需要实现的功能
- 客户端向服务器端发送字符串”Time”。
- 服务器端收到该字符串后,返回当前系统时间。
- 客户端向服务器端发送字符串”Exit”。
- 服务器端返回”Bye”,然后结束TCP连接。
很显然,这里用BufferedReader就很不错,至于输出,值得一提的是这里我并没有用“BufferedWriter”,而是用了“PrintWriter”,PrintWriter相对于BufferedWriter多了一个格式化输出(自动换行之类的,比较方便,虽然会慢一点)
下面直接上源码

附上一张运行效果图~

再举一个文件上传的例子
- 客户端从用户输入获得待请求的文件名。
- 客户端向服务器端发送文件名。
- 服务器端收到文件名后,传输文件。
- 客户端接收文件,重命名并存储在硬盘。
看到这里,你可能会想,用BufferedReader读取文件名,再用DataInputStream写入文件?
很遗憾,这并不合适,不同的流串用会导致缓冲区混乱,从而导致写入的文件有缺失。
因此统一使用DataInputStream是更合适的选择
下面直接给源码

