-- Java中实现线程的方式有两种,一是生成Thread类的子类,并定义该子类自己的run方法,线程的操作在方法run中实现。但我们定义的类一般是其他类的子类,而Java又不允许多重继承,因此第二种实现线程的方法是实现Runnable接口。通过覆盖Runnable接口中的run方法实现该线程的功能。本文例子采用第一种方法实现线程。
用Java实现多线程服务器程序(2)
时间:2009-10-10 天津大学管理学院
---- 二、多线程服务器程序举例
---- 以下是我们在项目中采用的多线程服务器程序的架构,可以在此基础上对命令进行扩充。本例未涉及数据库。如果在线程运行中需要根据用户指令对数据库进行更新操作,则应注意线程间的同步问题,使同一更新方法一次只能由一个线程调用。这里我们有两个类,receiveServer包含启动代码(main()),并初始化ServerSocket的实例,在accept方法返回用户请求后,将返回的套接字(Socket)交给生成的线程类serverThread的实例,直到该用户结束连接。
//类receiveServer
import java.io.*;
import java.util.*;
import java.net.*;
public class receiveServer{
final int RECEIVE_PORT=9090;
//该服务器的端口号
//receiveServer的构造器
public receiveServer() {
ServerSocket rServer=null;
//ServerSocket的实例
Socket request=null; //用户请求的套接字
Thread receiveThread=null;
try{
rServer=new ServerSocket(RECEIVE_PORT);
//初始化ServerSocket
System.out.println("Welcome to the server!");
System.out.println(new Date());
System.out.println("The server is ready!");
System.out.println("Port: "+RECEIVE_PORT);
while(true){ //等待用户请求
request=rServer.accept();
//接收客户机连接请求
receiveThread=new serverThread(request);
//生成serverThread的实例
receiveThread.start();
//启动serverThread线程
}
}catch(IOException e){
System.out.println(e.getMessage());}
}
public static void main(String args[]){
new receiveServer();
} //end of main
} //end of class
//类serverThread
import java.io.*;
import java.net.*;
class serverThread extends Thread {
Socket clientRequest;
//用户连接的通信套接字
BufferedReader input; //输入流
PrintWriter output; //输出流
public serverThread(Socket s)
{ //serverThread的构造器
this.clientRequest=s;
//接收receiveServer传来的套接字
InputStreamReader reader;
OutputStreamWriter writer;
try{ //初始化输入、输出流
reader=new InputStreamReader
(clientRequest.getInputStream());
writer=new OutputStreamWriter
(clientRequest.getOutputStream());
input=new BufferedReader(reader);
output=new PrintWriter(writer,true);
}catch(IOException e){
System.out.println(e.getMessage());}
output.println("Welcome to the server!");
//客户机连接欢迎词
output.println("Now is:
"+new java.util.Date()+" "+
"Port:"+clientRequest.getLocalPort());
output.println("What can I do for you?");
}
public void run(){ //线程的执行方法
String command=null; //用户指令
String str=null;
boolean done=false;
while(!done){
try{
str=input.readLine(); //接收客户机指令
}catch(IOException e){
System.out.println(e.getMessage());}
command=str.trim().toUpperCase();
if(str==null || command.equals("QUIT"))
//命令quit结束本次连接
done=true;
else if(command.equals("HELP"
|