3.4多线程在网络通信中的应用
? 本节主要内容
– 线程在网络通信中的应用
– 多客户服务程序的实现
? 任务
1,实现读者远程修改功能 ;
2,实现读者信息新增功能。
3.4.1基于多线程的网络程序设计
? 要使服务器程序能同时为多个客户提供服务,
– 首先,要把网络监听部分放入一个循环,每当接收一个客户
端的请求,就启动一个线程来服务于这个客户端。
– 然后继续监听新的客户连接请求。
– 要实现具有多任务处理能力的服务程序,通常将服务程序设
计为两个类,
? 一个服务类,用于接收客户端的连接请求和提供服务端的服务
功能的实现。
? 另一个类则称为服务通信类,它的主要作用是与当前客户端进
行数据交换。它负责解析当前客户端发送的各种类型的服务请
求命令,并根据收到的命令去执行相应的服务。 在多任务的并
发处理时应当注意对共享资源访问的同步和互斥处理。
3.4.1基于多线程的网络程序设计
? 在 Java中可通过如下程序来实现,服务器可以接受多个客户的连接
请求,其中 Server类是指服务器程序的主程序,Work类就是与客户
端绑定的网络通信类,它是以线程的形式运行的。
? public class Server
? { ServerSocket ss ; //设定服务套接字和端口号
? int port =8080;
? Public Server()//构造方法
? {try{
? ss = new ServerSocket(port); //创建服务监听端口
? }catch(IOException e){
? ….} }
3.4.1基于多线程的网络程序设计
? public void startServer()//接收客户的连接请求
? { Try{ Socket socket = null;
? While(true) //循环等待客户端的连接
? {socket = ss.accept(); //等待接收客户的连接请求
? Work client = new Work (this,socket) ; //创建客户处理线程
? client.start() ; //启动客户通信处理线程 } }catch(Exception e){
? }}
? public class Work extends Thread{//定义与客户通信的线程类
? …
? public Work (Server server,Socket socket){
? … }
? public void run() //线程处理方法 {…
? }}
3.4.1基于多线程的网络程序设计
? 示例 3.4.1 请使用多线程的网络通信技术实现本
节项目中所提出的任务 1。
– 分析,
? 1.客户端
– 客户端主要由五个类组成,
– 1) 常量定义类 —— ServiceOrder类
3.4.1基于多线程的网络程序设计
? //查询读者命令
? public final static String FIND_READER = "FindReader";
? //修改读者信息命令
? public final static String MODIFY_READER = "ModifyReader";
? //新增读者信息命令
? public final static String INS_READER = "InsertReader";
? public final static String LOGIN = "Login"; //登录命令
? public final static String RUN_SUCCESS = "OK"; //成功标志
? public final static String LIB_EXIT = "Bye"; //客户退出标志
? public final static String SERVER_IP = "172.0.0.1";//服务器端 IP地址
? //用户数据库文件名
? public final static String USER_DB_FILE = "User.dat";
? public final static int SERVER_PORT = 1234; //服务器监听端口号
3.4.1基于多线程的网络程序设计
? 2) 客户图形界面类 ——ModifyReaderFrame类
方法名 说明
public ModifyReaderFrame(Object mc) 界面构造器,主要用于初始操作界
面
private void add(Component c,
GridBagConstraints gbc,int x,
int y,int w,int h)
向窗体加入各种可视组件方法
public String getFindKey() 取查询读者信息关键字
public UserRecord getUser() 取当前编辑的读者信息,以读者对
象的形式返回
public void displayResult(UserRecord result) 显示查询结果
public void setEnable(boolean flag) 设置控件可用性
3.4.1基于多线程的网络程序设计
? 3) 消息类 ——Message类
– 该类主要负责对客户与服务器之间传输的消息进行
封装,以简化对消息的操作,它由两个属性组成:
服务命令字( strOrder)和命令参数对象
( message)。
3.4.1基于多线程的网络程序设计
? 4) 客户端修改读者信息业务类 ——Client类
方法 说明
public void start() 初始化客户端
public void receive() 接收服务器端的响应信息
public void send(Message objMsg) 发送消息到服务器端
public void actionPerformed(ActionEvent evt) 按钮行为事件处理方法,它是通过按钮所设
置的行为命令字来区分的
public static void main(String[] args) 客户端主程序函数,用于启动客户端
3.4.1基于多线程的网络程序设计
? 5) 读者记录类 ——UserRecord类
– 主要提供对读者信息的描述。具体可参见书 1.2节中
的任务解决部分。
? 客户端的类图如图所示,
3.4.1基于多线程的网络程序设计
? 客户端对读者信息修改的过程如下面顺序图所
示,
3.4.1基于多线程的网络程序设计
? 客户端运行后的结果如图,
3.4.1基于多线程的网络程序设计
? 2.服务器端
– 实现上述功能可以通过设计两个类来完成上述功能,
– 1) 服务类 ——Server类
? 主要提供接入客户的连接请求和实现读者信息的修改
操作。该类通过构造一个“死循环”的方式来连续接
受多个客户的连接请求,并为每个客户创建一个服务
线程来处理该客户的请求服务。
3.4.1基于多线程的网络程序设计
方法名 说明
void start() 服务器加载方法
void displayState(String stateInfo) 显示服务器工作状态信息
void readUser() 从读者库文件中读取读者信息,同步方法
void saveUser() 保存读者记录到数据库,它是同步方法
UserRecord findUserByName(String userName) 根据读者名称查询读者信息,同步方法
void modifyUser(UserRecord oldur,UserRecord
newur)
修改指定的读者信息,同步方法
static void main(String[] args) 服务器主程序
3.4.1基于多线程的网络程序设计
? 2) 工作类 ——Work类
方法名 说明
Work(Server server,Socket client,String
clientName)
构造方法,主要完成对象的初始化
void run() 线程主执行程序,主要实现循环等待接收
客户发送的消息,并根据收到的消息
执行相应的操作
void receive() 接收客户端发送的消息
void protocol(Message objMsg) 客户端命令的解析和执行解析到的命令
void send(Message objMsg) 发送服务响应消息给客户端
3.4.1基于多线程的网络程序设计
? 在服务端中主要是由两个类组成的,它们之间
的关系如图 3.4.4中的类图所示,
3.4.1基于多线程的网络程序设计
? 服务器执行读者信息修改的处理如图 3.4.5中的
顺序图所示。
3.4.1基于多线程的网络程序设计
? 服务器程序运行后的结果如图 3.4.6所示。
精练
? 分析:从示例 3.4.1可知,要实新增读者的功能只需要在示
例的基础上新一种服务即可。也就是说,只要在示例 3.4.1
的 Work类中的 protocol方法中对扩展一项对新增读者信息命
令的进行解析处理,同时在 Server类中增加一个新增读者
的方法,其新增的算法可参照该类中的修改读者信息方法
即 modifyUser方法中的算法即可。
读 者 新 增
读 者 新 增
读 者 编 号,
读 者 姓 名,
读 者 类 型,
读 者 基 本 信 息,
输 入 文 本
输 入 更 多 文 本
学 生
新 增 退 出
小结
? 通常多客户服务器程序通常的工作方式是,
– 首先,把网络监听部分放入一个死循环,每当一个客户端的
请求到达,就新启动一个线程来服务于这个客户端。
– 然后监听程序继续新的客户连接请求。
? 要实现具有多任务处理能力的服务程序,通常将服务
程序设计为两个类,
– 一个服务类,用于接收客户端的连接请求和提供服务端的服
务功能的实现。
– 另一个类则称为服务通信类,通常它是以线程的形式运行在
服务器端。它主要的作用是与当前客户端进行数据交换。它
负责解析当前客户端发送的各种类型的服务请求命令,并根
据收到的命令去执行相应的服务。在多任务的并发处理时应
当注意对共享资源访问的同步和互斥处理。