前置知识: Java中的Socket编程
什么是多线程服务器: 拥有不止一个线程的服务器被称为多线程服务器。当客户端发送请求时,会生成一个线程,用户通过该线程与服务器进行通信。我们需要生成多个线程,以便同时接受来自多个客户端的多个请求。
多线程服务器的优势:
- 快速且高效: 多线程服务器能够高效、快速地响应日益增长的客户端查询请求。
- 减少用户等待时间: 在单线程服务器中,其他用户必须等待当前运行的进程完成;而在多线程服务器中,所有用户都可以同时获得响应,因此没有用户需要等待其他进程结束。
- 线程之间相互独立: 任意两个线程之间没有关联。每当连接一个客户端时,都会生成一个新的线程。
- 单个线程的问题不会影响其他线程: 如果任何一个线程发生错误,不会干扰其他线程,所有其他进程都会继续正常运行。而在单线程服务器中,如果线程中出现任何问题,其他每个客户端都不得不等待。
多线程服务器的劣势:
- 代码复杂: 编写多线程服务器的代码比较困难。这类程序不容易创建。
- 调试困难: 很难分析错误的主要原因和来源。
快速概览
我们创建两个Java文件:Client.java 和 Server.java。客户端文件只包含一个类 Client(用于创建客户端)。服务器端文件包含两个类,Server(创建服务器)和 ClientHandler(使用多线程处理客户端)。
客户端程序: 客户端可以使用此代码与服务器通信。这包括以下步骤:
- 建立 Socket 连接
- 进行通信
Java
CODEBLOCK_a7fb16a0
服务器端程序: 当连接新的客户端,并且客户端向服务器发送消息时。
1. Server 类: 服务器端涉及的步骤与 Java中的Socket编程 一文类似,但稍作修改:在获取流和端口号之后创建线程对象。
- 建立连接: 初始化服务器套接字对象,并在一个 while 循环中,让套接字对象持续接受传入的连接。
- 获取流: 从当前请求的套接字对象中提取 inputstream 对象和 outputstream 对象。
- 创建处理器对象: 获取流和端口号后,使用这些参数创建一个新的 clientHandler 对象(即上述类)。
- 调用 start() 方法: 在这个新创建的线程对象上调用 start() 方法。
2. ClientHandler 类: 由于我们将为每个请求使用单独的线程,让我们来了解一下实现 Runnable 接口的 ClientHandler 类的工作原理和实现。这个类的对象充当新线程的 Runnable 目标。
- 首先,这个类实现了Runnable接口。这意味着