Chinaunix首页 | 论坛 | 博客
  • 博客访问: 402119
  • 博文数量: 126
  • 博客积分: 3002
  • 博客等级: 少校
  • 技术积分: 1210
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-30 15:04
文章分类

全部博文(126)

文章存档

2012年(14)

2011年(63)

2010年(36)

2009年(13)

分类: Java

2011-11-14 14:39:12

多线程socket实例 package com.fb.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; 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(); } } 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; 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 com.fb.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; 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)); } exec.shutdown(); } // 定义一个简单的任务 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("bye\r\n".getBytes()); socketOut.write("bye\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(); }finally{ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }; } }
阅读(598) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~