文档详情

服务端——类.doc

发布:2017-07-04约2.11万字共20页下载文档
文本预览下载声明
/** * 服务器,接受用户登录、离线、转发消息 public class Server { private ExecutorService executorService;// 线程池private ServerSocket serverSocket = null; private Socket socket = null;private boolean isStarted = true; public Server() { try { // 创建线程池,池中具有(cpu个数*50)条线程 executorService = Executors.newFixedThreadPool(Runtime.getRuntime() .availableProcessors() * 50); serverSocket = new ServerSocket(Constants.SERVER_PORT); } catch (IOException e) { e.printStackTrace(); quit(); } } public void start() { System.out.println(MyDate.getDateCN() + 服务器已启动...); try { while (isStarted) { socket = serverSocket.accept(); String ip = socket.getInetAddress().toString(); System.out.println(MyDate.getDateCN() + 用户: + ip + 已建立连接); // 为支持多用户并发访问,采用线程池管理每一个用户的连接请求 if (socket.isConnected()) executorService.execute(new SocketTask(socket));// 添加到线程池 } if (socket != null) socket.close(); if (serverSocket != null) serverSocket.close(); } catch (IOException e) { e.printStackTrace(); // isStarted = false; } } private final class SocketTask implements Runnable { private Socket socket = null;private InputThread in; private OutputThread out; private OutputThreadMap map; public SocketTask(Socket socket) { this.socket = socket; map = OutputThreadMap.getInstance(); } @Override public void run() { out = new OutputThread(socket, map);// // 先实例化写消息线程,(把对应用户的写线程存入map缓存器中) in = new InputThread(socket, out, map);// 再实例化读消息线程 out.setStart(true); in.setStart(true); in.start(); out.start(); } } /** * 退出 */ public void quit() { try { this.isStarted = false; serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { new Server().start(); } } ????????///////////////////////////////////////////////////////////////////// * 存放写线程的缓存器 public class OutputThreadMap { private HashMapInteger, OutputThread map; private static OutputThreadMap instance; // 私有
显示全部
相似文档