java下socket多线程通信的例子
服务器端,通过线程池来启动socket连接;
客户端,使用socket进行连接。
package sa.fs121.led.socket;

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.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* socket通信服务器端<br>
* *******************
**********
*    
* @author xiaosa
* @copyright (C)2009www.xiaosa.org
* @createTime 2009上午12:11:37
* @version $Id: *
*******************************    
*/

public class SocketServer {

  private static Log log = LogFactory.getLog(SocketServer.class);

  private final int PORT = 9090; // 通信端口
  private ServerSocket serverSocket; // socket服务
  private ExecutorService executorService;// 线程池
  private final int POOL_SIZE = 5;// 单个CPU线程池大小

  /**
    * 构造socket,使用线程池启动服务
    *    
    * @throws IOException
    */

  public SocketServer() throws IOException {
    serverSocket = new ServerSocket(PORT);
    executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);
    log.info("服务器启动,使用线程池数量:" + PORT);
  }

  /**
    * 创建socket服务
    */

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

      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

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

}

/**
* socket服务处理器
*/

class SocketHandler implements Runnable {

  private static Log log = LogFactory.getLog(SocketHandler.class);

  private Socket socket; // 启动的socket

  /**
    * 构造socket服务处理器
    *    
    * @param socket
    *                        socket服务
    */

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

  /**
    * 获取输出流,即准备向客户端发送数据
    *    
    * @param socket
    *                        socket服务
    * @return 输出流
    * @throws IOException
    *                         io操作异常
    */

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

  /**
    * 获取输入流,即接收客户端发送过来的数据
    *    
    * @param socket
    *                        socket服务
    * @return 输入流,封装成字节对象
    * @throws IOException
    *                         IO操作异常
    */

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

  /**
    * 输出
    *    
    * @param msg
    *                        输出内容
    * @return 服务器输出
    */

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

  public void run() {
    try {
      log.info("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort());
      BufferedReader br = getReader(socket);
      PrintWriter pw = getWriter(socket);
      String msg = null;
      while ((msg = br.readLine()) != null) {
        System.out.println(msg);
        pw.println(echo(msg));
        if (msg.equals("bye"))
          break;
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if (socket != null)
          socket.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}
package sa.fs121.led.socket;

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;

/**
* socket通信客户端<br>
* *****************************
*    
* @author xiaosa
* @copyright (C)2009www.xiaosa.org
* @createTime 2009上午12:20:56
* @version $Id: *
*******************************    
*/

public class SocketClient {

  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();
        }
      }

    };
  }
}