javaliver 发表于 2013-1-15 08:16:30

网络服务器模型多线层处理

package javasrc.thread;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** ** @author PC504 * 网络服务器模型,一旦有客户端连接到该服务器, * 则启动一个新线程为该连接服务,服务内容为往客户端输送一些字符信息 * 1. 建立监听端口,创建线程池。 * 2. 发现有新连接,使用线程池来执行服务任务。 * 3. 服务完毕,释放线程到线程池 * */public class ThreadUtil{private static final int PORT = 19527;private ServerSocket serverSocket = null;private ExecutorService pool = null;public static void main(String[] args) {//ThreadUtil tu = new ThreadUtil();tu.start();}public void start(){try {//新建了一个线程池,线程池里面有 3 个线程为任务队列服务.如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务pool = Executors.newFixedThreadPool(3);serverSocket = new ServerSocket(PORT); //ServerSocket 对象来初始化监听端口serverSocket.setReuseAddress(true);System.out.println("I'm listening"); while(true){Socket socket = serverSocket.accept(); //当有新连接建立时,accept 返回时,将服务任务提交给线程池执行 pool.execute(new ServiceThread(socket)); } } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}cleanup();} public void cleanup() {         if (null != serverSocket) {             try {             System.out.println("serverSocket.close()");            serverSocket.close();             } catch (IOException e) {               // TODO Auto-generated catch block               e.printStackTrace();             }         }         //serverThreadPool.shutdown();         pool.shutdown();   } } package javasrc.thread;import java.io.DataOutputStream;import java.io.IOException;import java.io.Serializable;import java.net.Socket;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.locks.ReentrantLock;public class ServiceThread implements Runnable , Serializable{/** * protocolxieyi layerindependent duyi */private static final long serialVersionUID = 1L;private static ReentrantLocklock = new ReentrantLock();private Socket socket = null;private static int count = 0;public static int getCount() {int ret = 0;try {lock.lock();ret = count;} catch (Exception e) {// TODO: handle exceptionlock.unlock();}return ret;} private void increaseCount(){try{lock.lock();++count;}finally{lock.unlock();}} public ServiceThread(){}public ServiceThread(Socket socket){this.socket = socket;}public void run() { increaseCount();         int curCount = getCount();         String helloString = "hello, id = " + curCount + "\r\n";         ExecutorService executor = Executors.newSingleThreadExecutor();         Future<String> future = executor.submit(new TimeConsumingTask());//Future 表示异步计算的结果      DataOutputStream dos = null;         try {             dos = new DataOutputStream(this.socket.getOutputStream());             dos.write(helloString.getBytes());             try {               dos.write("let's do soemthing other.\r\n".getBytes());               String result = future.get();               dos.write(result.getBytes());             } catch (InterruptedException e) {               e.printStackTrace();             } catch (ExecutionException e) {               e.printStackTrace();             }         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();         } finally {             if (null != this.socket) {               try {                     this.socket.close();               } catch (IOException e) {                     // TODO Auto-generated catch block                     e.printStackTrace();               }             }             if (null != dos) {               try {                     dos.close();               } catch (IOException e) {                     // TODO Auto-generated catch block                     e.printStackTrace();               }             }             executor.shutdown();         }   } }class TimeConsumingTask implements Callable<String> {   public String call() throws Exception {       System.out.println("It's a      time-consuming task,you'd better retrieve your result in the furture");       return "ok, here's the result: It takes me lots of time to produce this result";    } }  在客户端cmd 下运行   telnet  127.0.0.1 19527  
页: [1]
查看完整版本: 网络服务器模型多线层处理