Socket服务器多线程,不多说了。。都懂,而且我也不知道对不对。。
服务端类:
1 package org.demo.socket; 2 3 import java.io.DataInputStream; 4 import java.io.DataOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.net.ServerSocket; 9 import java.net.Socket; 10 import java.util.concurrent.ExecutorService; 11 import java.util.concurrent.Executors; 12 13 /** 14 * 多线程Socket服务类 15 * @author Dream.V 16 * 17 */ 18 public class MultiThreadServer { 19 //线程池对象 20 private ExecutorService executorService; 21 //服务器监听端口 22 private final static int PORT = 8080; 23 //服务器套接字 对象 24 private ServerSocket serverSocket; 25 //客户端请求对象 26 private Socket socket; 27 //单个CPU线程数量 28 private final static int POOL_SIZE = 10; 29 //当前运行环境CPU线程数,I5(双核4线程) 30 private final static int CPU_THREADSIZE = Runtime.getRuntime().availableProcessors(); 31 32 public MultiThreadServer() throws IOException{ 33 //初始化服务器监听对象 34 serverSocket = new ServerSocket(PORT); 35 //初始化线程池 36 executorService = Executors.newFixedThreadPool(POOL_SIZE*CPU_THREADSIZE); 37 System.out.println("server start ! \r\ncurrent thread pool size = "+POOL_SIZE*CPU_THREADSIZE); 38 } 39 40 public void service() throws IOException{ 41 while(true){ 42 //阻塞式的方法 43 socket = serverSocket.accept(); 44 System.out.println("新的请求来自于:"+socket.getInetAddress()+" 端口为:"+socket.getPort()); 45 executorService.execute(new MyHandler(socket)); 46 } 47 } 48 49 public static void main(String[] args) throws IOException { 50 new MultiThreadServer().service(); 51 } 52 } 53 54 class MyHandler implements Runnable { 55 //客户端请求对象 56 public static Socket socket; 57 //构造方法 58 public MyHandler(Socket socket){ 59 this.socket = socket; 60 } 61 //获取输入流对象 62 public static DataInputStream getDataInputStream() throws IOException{ 63 InputStream is = socket.getInputStream(); 64 DataInputStream dis = new DataInputStream(is); 65 return dis; 66 } 67 //获得输出流对象 68 public static DataOutputStream getDataOutputStream() throws IOException{ 69 OutputStream os = socket.getOutputStream(); 70 DataOutputStream dos = new DataOutputStream(os); 71 return dos; 72 } 73 public void run() { 74 try { 75 DataInputStream dis = getDataInputStream(); 76 DataOutputStream dos = getDataOutputStream(); 77 //读取送客户端发送过来的字符串 78 String str = dis.readUTF(); 79 System.out.println("客户端发送过来的信息为:"+str); 80 if(str.equals("bye")){ 81 //向客户端发送字符串 82 dos.writeUTF("bye bye!"); 83 }else{ 84 //向客户端发送字符串 85 dos.writeUTF("good!"); 86 } 87 } catch (IOException e) { 88 e.printStackTrace(); 89 } 90 } 91 }
客户端类:
1 package org.demo.socket; 2 3 import java.io.DataInputStream; 4 import java.io.DataOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.net.Socket; 9 import java.net.UnknownHostException; 10 11 public class MultiThreadClient { 12 public static void main(String[] args) throws UnknownHostException, IOException { 13 for (int i = 0; i < 10; i++) { 14 //localhost是一样的,发送一个请求到服务端 15 Socket socket = new Socket("127.0.0.1", 8080); 16 InputStream is = socket.getInputStream(); 17 DataInputStream dis = new DataInputStream(is); 18 OutputStream os = socket.getOutputStream(); 19 DataOutputStream dos = new DataOutputStream(os); 20 if(i%10==5){ 21 dos.writeUTF("bye"); 22 }else{ 23 dos.writeUTF("I love java"); 24 } 25 //接受从服务端发送回来的字符串 26 String str = dis.readUTF(); 27 // 28 System.err.println("TASK "+i+" 服务器返回值为:"+str); 29 } 30 } 31 }
不知道对不对。。。哎,,我的国庆啊。。。god damn it!