Server
package com.bobo.org.mvc.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by Bobo on 2015/11/19. */ public class Server { // 服务器端口 private static final int SERVERPORT = 8888; // 客户端连接 private static List<Socket> mClientList = new ArrayList<Socket>(); // 线程池 private ExecutorService mExecutorService; // serverSocket对象 private ServerSocket mServerSocket; public static void main(String[] args) { new Server(); } public Server() { try { // 设置服务器端口 mServerSocket = new ServerSocket(SERVERPORT); // 创建一个线程池 mExecutorService = Executors.newCachedThreadPool(); System.out.println("start..."); // 用来临时保存客户端连接的Socket对象 Socket client = null; while(true) { // 接受客户度连接并添加到List中 client = mServerSocket.accept(); mClientList.add(client); mExecutorService.execute(new ThreadServer(client)); } } catch(Exception e) { e.printStackTrace(); } } // 每个客户端单独开启一个线程 static class ThreadServer implements Runnable { private Socket mSocket; private BufferedReader mBufferedReader; private PrintWriter mPrintWriter; private String mStrMSG; public ThreadServer(Socket socket) throws IOException { this.mSocket = socket; // 设置读取套接字客户端发送流的编码格式 mBufferedReader = new BufferedReader(new InputStreamReader( socket.getInputStream(), "GB2312")); mStrMSG = "user:" + this.mSocket.getInetAddress() + " come total:" + mClientList.size(); sendMessage(); } private void sendMessage() throws IOException { System.out.println(mStrMSG); for(Socket client : mClientList) { // 设置向套接字客户端写入流的编码格式 mPrintWriter = new PrintWriter(new OutputStreamWriter( client.getOutputStream(), "GB2312"), true); mPrintWriter.println(mStrMSG); } } public void run() { try { while((mStrMSG = mBufferedReader.readLine()) != null) { if(mStrMSG.trim().equals("exit")) { // 当一个客户端退出时 mClientList.remove(mSocket); mBufferedReader.close(); mPrintWriter.close(); mStrMSG = "user:" + this.mSocket.getInetAddress() + " exit tatal:" + mClientList.size(); mSocket.close(); sendMessage(); break; } else { mStrMSG = mSocket.getInetAddress() + ":" + mStrMSG; sendMessage(); } } } catch(Exception e) { e.printStackTrace(); } } } }
Client
package com.bobo.org.mvc.test; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by Bobo on 2015/11/19. */ public class Client { private static final int PORT = 8888; // 线程池 private static ExecutorService exec = Executors.newCachedThreadPool(); public static void main(String[] args) throws Exception { new Client(); } public Client() { try { Socket socket = new Socket("127.0.0.1", PORT); exec.execute(new Sender(socket)); // 设置读取套接字服务器返回流的编码格式 BufferedReader br = new BufferedReader(new InputStreamReader( socket.getInputStream(), "GB2312")); String msg; while((msg = br.readLine()) != null) { System.out.println(msg); } } catch(Exception e) { System.out.println(e.getMessage()); } } // 客户端线程获取控制台输入消息 static class Sender implements Runnable { private Socket socket; public Sender(Socket socket) { this.socket = socket; } public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); // 设置向套接字服务器写入流的编码格式 PrintWriter pw = new PrintWriter(new OutputStreamWriter( socket.getOutputStream(), "GB2312"), true); String msg; while(true) { msg = br.readLine(); pw.println(msg); if(msg.trim().equals("exit")) { pw.close(); br.close(); exec.shutdownNow(); break; } } } catch(Exception e) { e.printStackTrace(); } } } }