线程池在socket通信中的应用

来源:互联网 发布:电商平台数据库设计 编辑:程序博客网 时间:2024/05/20 03:05
 *****************************************服务器部分*****************************************************************

package com.socket.complex;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.*;
import java.util.concurrent.*;

public class MultiThreadServer {
 private int port = 8821;
 private ServerSocket serverSocket;
 private ExecutorService executorService;// 线程池
 private final int POOL_SIZE = 10;// 单个CPU线程池大小

 public MultiThreadServer() throws IOException {
  serverSocket = new ServerSocket(port);
  // Runtime的availableProcessor()方法返回当前系统的CPU数目.
  executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);
  System.out.println("服务器启动");
 }

 public void service() {
  while (true) {
   Socket socket = null;
   try {
    // 接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
    socket = serverSocket.accept();
    executorService.execute(new Handler(socket));
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }

 public static void main(String[] args) throws IOException {
  new MultiThreadServer().service();
 }
}

***********************************************处理类部分************************************************************

package com.socket.complex;

import java.io.*;
import java.net.*;

/**
 *
 */
public class Handler implements Runnable {
 private Socket socket;

 public Handler(Socket socket) {
  this.socket = socket;
 }

 private PrintWriter getWriter(Socket socket) throws IOException {
  OutputStream socketOut = socket.getOutputStream();
  return new PrintWriter(socketOut, true);
 }

 private BufferedReader getReader(Socket socket) throws IOException {
  InputStream socketIn = socket.getInputStream();
  return new BufferedReader(new InputStreamReader(socketIn));
 }

 public String echo(String msg) {
  return "echo:" + msg;
 }

 public void run() {
  try {
   System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort());
   BufferedReader br = getReader(socket);
   PrintWriter pw = getWriter(socket);
   String msg = null;
   pw.println("Welcome client:"+socket.getPort());//pw希望能和客户端交互
   while ((msg = br.readLine()) != null) {
    System.out.println(msg);
    pw.println("Server get messgae:"+msg);//pw希望能和客户端交互
    pw.println(echo(msg));
    if (msg.equals("shutdown")){
     System.out.println("Connection disconnect " + socket.getInetAddress() + ":" + socket.getPort());
     break;
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    if (socket != null)
     socket.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
}

 

***********************************************客户端部分*********************************************************

package com.socket.complex;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *
 */
public class MultiThreadClient {

 public static void main(String[] args) {
  int numTasks = 10;
  ExecutorService exec = Executors.newCachedThreadPool();
  for (int i = 0; i < numTasks; i++) {
   exec.execute(createTask(i));
  }
 }

 // 定义一个简单的任务
 private static Runnable createTask(final int taskID) {
  return new Runnable() {
   private Socket socket = null;
   private int port = 8821;

   public void run() {
    System.out.println("Task " + taskID + ":start");
    try {
     socket = new Socket("localhost", port);
     // 发送关闭命令
     OutputStream socketOut = socket.getOutputStream();
     socketOut.write("shutdown\\r\\n".getBytes());
     // 接收服务器的反馈
     BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     String msg = null;
     while ((msg = br.readLine()) != null)
      System.out.println(msg);
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  };
 }
}