java怎样实现多线程:用Java实现多线程服务器程序来源: 发布时间:星期六, 2009年2月21日 浏览:0次 评论:0
Java是伴随Internet大潮产生对网络及多线程具有内在支持具有网络时代编程语言切特点从Java当前应用看Java主要用于在Internet或局域网上网络编程而且将Java作为主流网络编程语言趋势愈来愈明显实际工作中我们除了使用商品化服务器软件Software外时常需要按照实际环境编写自己服务器软件Software以完成特定任务或和特定客户端软件Software实现交互在实现服务器时为提高运行效率降低用户等待时间我们应用了在Java Applet中常见多线程技术
、Java中服务器和多线程
在Java的前没有种主流编程语言能够提供对高级网络编程固有支持在其他语言环境中实现网络往往需要深入依赖于操作平台网络API技术中去而Java提供了对网络支持无平台相关性完整软件Software包使员没有必要为系统网络支持细节而烦恼 Java软件Software包内在支持网络协议为TCP/IP也是当今最流行广域网/局域网协议Java有关网络类及接口定义在java.net包中客户端软件Software通常使用java.net包中核心类Socket和服务器某个端口建立连接而服务器区别于客户机它需要化个端口进行监听遇到连接呼叫才和相应客户机建立连接Java.net包ServerSocket类包含了编写服务器系统所需切下面给出ServerSocket类部分定义 1 public ServerSocket 2 { 3 public ServerSocket( port) 4 throws IOException ; 5 public Socket accept throws IOException ; 6 public InetAddress getInetAddress ; 7 public getLocalPort ; 8 public void close throws IOException ; 9 public synchronized void SoTimeout ( timeout) throws SocketException ; 10 public synchronized getSoTimeout throws IOException ; 11 } 12 ServerSocket构造器是服务器运行基础它将参数port指定端口化作为该服务器端口监听客户机连接请求Port范围是0到65536但0到1023是标准Internet协议保留端口而且在Unix主机上这些端口只有root用户可以使用般自定义端口号在8000到16000的间仅化了ServerSocket还是远远不够它没有同客户机交互套接字(Socket)因此需要该类accept思路方法接受客户呼叫Accept思路方法直到有连接请求才返回通信套接字(Socket)例子通过这个例子输入、输出流服务器可以接收用户指令并将相应结果回应客户机ServerSocket类getInetAddress和getLocalPort思路方法可得到该服务器IP地址和端口SoTimeout和getSoTimeout思路方法分别是设置和得到服务器超时设置如果服务器在timout设定时间内还未得到accept思路方法返回套接字例子则抛出IOException异常 Java多线程可谓是Java编程精华的运用得当可以极大地改善响应时间提高并行性在服务器中由于往往要接收区别客户机同时请求或命令因此可以对每个客户机请求生成个命令处理线程同时对各用户指令作出反应在些较复杂系统中我们还可以为每个数据库查询指令生成单独线程并行对数据库进行操作实战证明采用多线程设计可以很好改善系统响应并保证用户指令执行独立性由于Java本身是"线程安全"因此有条编程原则是能够独立在个线程中完成操作就应该开辟个新线程 Java中实现线程方式有两种是生成Thread类子类并定义该子类自己run思路方法线程操作在思路方法run中实现但我们定义类般是其他类子类而Java又不允许多重继承因此第 2种实现线程思路方法是实现Runnable接口通过覆盖Runnable接口中run思路方法实现该线程功能本文例子采用第种思路方法实现线程 2、多线程服务器举例 以下是我们在项目中采用多线程服务器架构可以在此基础上对命令进行扩充本例未涉及数据库如果在线程运行中需要根据用户指令对数据库进行更新操作则应注意线程间同步问题使同更新思路方法次只能由个线程这里我们有两个类receiveServer包含启动代码()并化ServerSocket例子在accept思路方法返回用户请求后将返回套接字(Socket)交给生成线程类serverThread例子直到该用户结束连接 1 //类receiveServer 2 import java.io.*; 3 import java.util.*; 4 import java.net.*; 5 6 public receiveServer{ 7 final RECEIVE_PORT=9090; //该服务器端口号 8 //receiveServer构造器public receiveServer {ServerSocket rServer=null; 9 //ServerSocket例子 10 Socket request=null; 11 //用户请求套接字Thread receiveThread=null; 12 try{ 13 rServer= ServerSocket(RECEIVE_PORT); 14 //化ServerSocket .out.prln("Welcome to the server!"); 15 .out.prln( Date); 16 .out.prln("The server is ready!"); 17 .out.prln("Port: "+RECEIVE_PORT); 18 while(true){ //等待用户请求 request=rServer.accept; //接收客户机连接请求receiveThread= serverThread(request); 19 20 //生成serverThread例子 21 receiveThread.start; 22 23 //启动serverThread线程 24 } 25 } 26 catch(IOException e){ 27 .out.prln(e.getMessage) ; 28 } 29 } public void (String args){ receiveServer; 30 31 } //end of } //end of //类serverThreadimport java.io.*; 32 33 import java.net.*; 34 serverThread extends Thread {Socket clientRequest; 35 //用户连接通信套接字BufferedReader input; 36 //输入流PrWriter output; 37 //输出流 38 public serverThread(Socket s) { 39 //serverThread构造器 this.clientRequest=s; 40 //接收receiveServer传来套接字 InputStreamReader reader; 41 42 OutputStreamWriter writer; 43 try{ 44 //化输入、输出流 45 reader= InputStreamReader(clientRequest.getInputStream); 46 writer= OutputStreamWriter(clientRequest.getOutputStream); 47 input= BufferedReader(reader); 48 output= PrWriter(writer,true); 49 } 50 catch(IOException e){ .out.prln(e.getMessage);} 51 output.prln("Welcome to the server!"); 52 //客户机连接欢迎词 53 output.prln("Now is: "+ java.util.Date+" "+ "Port:"+clientRequest.getLocalPort); 54 output.prln("What can I do for you?"); 55 } 56 57 public void run{ 58 //线程执行思路方法 59 String command=null; 60 //用户指令 String str=null; 61 boolean done=false; 62 while(!done){ 63 try{ 64 str=input.readLine; 65 //接收客户机指令 66 }catch(IOException e){ 67 .out.prln(e.getMessage); 68 } 69 command=str.trim.toUpperCase; 70 71 (strnull || command.equals("QUIT")) //命令quit结束本次连接 72 done=true; 73 (command.equals("HELP")){ 74 //命令help查询本服务器可接受命令 75 output.prln("query"); 76 output.prln("quit"); 77 output.prln("help"); 78 } 79 (command.startsWith("QUERY")){ 80 //命令 81 query output.prln("OK to query something!"); 82 }// …….. //在此可加入服务器其他指令 83 (!command.startsWith("HELP") && !command.startsWith("QUIT") && !command.startsWith("QUERY")){output.prln("Command not Found! 84 Please refer to the HELP!"); } 85 } 86 87 //end of while 88 89 try 90 { 91 clientRequest.close; 92 //关闭套接字 93 } 94 catch(IOException e){ 95 .out.prln(e.getMessage); 96 } 97 command=null; 98 } 99 100 //end of run 启动该服务器后可用telnet machine port命令连接其中machine为本机名或地址port为中指定端口也可以编写特定客户机软件Software通过TCPSocket套接字建立连接 ="xspace-totlerecord">3="xspace-totlepages">1/3="xspace-current">123> 0
相关文章读者评论发表评论 |