基于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字节流结构化数据高效读取二进制数据(intlong等)

因此,显然可以发现在读取文本的时候可以使用BufferedReader,在读取文件的时候更适合使用DataInputStream(当然你可以都用InputStream,不过会比较慢)

下面就给出一些Socket编程的例子,首先是Client与Server之间的文字通信,在这里以“系统时间查询”作为例子。
这里简单说一下需要实现的功能

  1. 客户端向服务器端发送字符串”Time”。
  2. 服务器端收到该字符串后,返回当前系统时间。
  3. 客户端向服务器端发送字符串”Exit”。
  4. 服务器端返回”Bye”,然后结束TCP连接。

很显然,这里用BufferedReader就很不错,至于输出,值得一提的是这里我并没有用“BufferedWriter”,而是用了“PrintWriter”,PrintWriter相对于BufferedWriter多了一个格式化输出(自动换行之类的,比较方便,虽然会慢一点)

下面直接上源码


1768362390196.png

1768362562448.png

附上一张运行效果图~

Server_Client_Time.png


再举一个文件上传的例子

  1. 客户端从用户输入获得待请求的文件名。
  2. 客户端向服务器端发送文件名。
  3. 服务器端收到文件名后,传输文件。
  4. 客户端接收文件,重命名并存储在硬盘。

看到这里,你可能会想,用BufferedReader读取文件名,再用DataInputStream写入文件?
很遗憾,这并不合适,不同的流串用会导致缓冲区混乱,从而导致写入的文件有缺失。
因此统一使用DataInputStream是更合适的选择
下面直接给源码


1768362678834.png

我要成为大剑天尊!