【网络原理】使用Java基于TCP搭建简单客户端与服务器通信_java完成基于tcp协议的网络通信客户端。
目录
- 🎄API介绍
-
- 🌸ServerSocket API
- 🌸Socket API
- 🍀TCP中的长短连接
- 🌳建立TCP回显客户端与服务器
-
- 🌸TCP搭建服务器
- 🌸TCP搭建客户端
- ⭕总结
TCP服务器与客户端的搭建需要借助以下API
🎄API介绍
🌸ServerSocket API
ServerSocket 是创建TCP服务端Socket的API。
ServerSocket 构造方法:
ServerSocket 方法:
🌸Socket API
Socket 是客户端Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服务端Socket。
不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。
Socket 构造方法:
Socket 方法:
🍀TCP中的长短连接
博主在前面的博文里面说到,TCP是面向连接的通信方式,TCP发送数据时,需要先建立连接,而这个连接又分为长短连接:
-
短连接:每次接收到数据并返回响应后,都关闭连接,即是短连接。也就是说,短连接只能一次收发数据。
-
长连接:不关闭连接,一直保持连接状态,双方不停的收发数据,即是长连接。也就是说,长连接可以多次收发数据
对比以上长短连接,两者区别如下:
-
建立连接、关闭连接的耗时:短连接每次请求、响应都需要建立连接,关闭连接;而长连接只需要第一次建立连接,之后的请求、响应都可以直接传输。相对来说建立连接,关闭连接也是要耗时的,长连接效率更高。
-
主动发送请求不同:短连接一般是客户端主动向服务端发送请求;而长连接可以是客户端主动发送请求,也可以是服务端主动发。
-
两者的使用场景有不同:短连接适用于客户端请求频率不高的场景,如浏览网页等。长连接适用于客户端与服务端通信频繁的场景,如聊天室,实时游戏等
拓展:
-
基于BIO(同步阻塞IO)的长连接会一直占用系统资源。对于并发要求很高的服务端系统来说,这样的消耗是不能承受的。
-
由于每个连接都需要不停的阻塞等待接收数据,所以每个连接都会在一个线程中运行。一次阻塞等待对应着一次请求、响应,不停处理也就是长连接的特性:一直不关闭连接,不停的处理请求
-
实际应用时,服务端一般是基于NIO(即同步非阻塞IO)来实现长连接,性能可以极大的提升。
🌳建立TCP回显客户端与服务器
🌸TCP搭建服务器
我们分为以下几步来实现:
- 创建TcpEchoServer类来表示我们的服务器,并创建ServerSocket对象,初始值为null
- 在TcpEchoServer的构造方法里进行ServerSocket对象的实例化
- 用一个start()方法表示启动程序
- 在该方法内我们首先要使用accept()进行连接,并用Socket对象进行接收
- 我们再用一个processConnection(Socket clientSocket)方法处理我们的连接
由于我们的TCP传输是以流的形式传播的,所以我们这里用到了读写数据流的方法来进行书写,不会这一部分的小伙伴,可以去看看博主所写【Java EE】文件内容的读写⸺数据流进行查看学习
接下来我们书写这个processConnection(Socket clientSocket)方法
- 读取请求,构造输入流的Scanner,并判断后面如果没有数据就关闭连接
- 然后我们将读取的数据交给我们的 response()构造响应
- 响应后的数据写入该套接字的输出流中,最后flush(),进行刷新,确保写入
为了释放资源,我们每一次交互完毕都需要对我们的套接字进行关闭,这里我们使用fially来进行处理
代码如下:
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.Scanner;public class TcpEchoServer { private ServerSocket serverSocket = null