java多线程控制台聊天室(转)

用java多线程实现一个控制台聊天室,呵呵,好玩! 
聊天室服务器端
  1. package tf.thread;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.concurrent.ExecutorService;
  11. import java.util.concurrent.Executors;
  12. public class ChatServer {
  13. private static final int PORT = 8888; // 端口号
  14. private static List<Socket> list = new ArrayList<Socket>(); // 保存连接对象
  15. private ExecutorService exec;
  16. private ServerSocket server;
  17. public static void main(String[] args) {
  18. new ChatServer();
  19. }
  20. public ChatServer() {
  21. try {
  22. server = new ServerSocket(PORT);
  23. exec = Executors.newCachedThreadPool();
  24. System.out.println("服务器已启动!");
  25. Socket client = null;
  26. while (true) {
  27. client = server.accept(); // 接收客户连接
  28. list.add(client);
  29. exec.execute(new ChatTask(client));
  30. }
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. static class ChatTask implements Runnable {
  36. private Socket socket;
  37. private BufferedReader br;
  38. private PrintWriter pw;
  39. private String msg;
  40. public ChatTask(Socket socket) throws IOException {
  41. this.socket = socket;
  42. br = new BufferedReader(new InputStreamReader(socket
  43. .getInputStream()));
  44. msg = "【" + this.socket.getInetAddress() + "】进入聊天室!当前聊天室有【"
  45. + list.size() + "】人";
  46. sendMessage();
  47. }
  48. public void run() {
  49. try {
  50. while ((msg = br.readLine()) != null) {
  51. if (msg.trim().equals("bye")) {
  52. list.remove(socket);
  53. br.close();
  54. pw.close();
  55. msg = "【" + socket.getInetAddress() + "】离开聊天室!当前聊天室有【"
  56. + list.size() + "】人";
  57. socket.close();
  58. sendMessage();
  59. break;
  60. } else {
  61. msg = "【" + socket.getInetAddress() + "】说:" + msg;
  62. sendMessage();
  63. }
  64. }
  65. } catch (IOException e) {
  66. e.printStackTrace();
  67. }
  68. }
  69. /**
  70. * 群发消息给聊天室的所有人
  71. */
  72. private void sendMessage() throws IOException {
  73. System.out.println(msg);
  74. for (Socket client : list) {
  75. pw = new PrintWriter(client.getOutputStream(), true);
  76. pw.println(msg);
  77. }
  78. }
  79. }
  80. }

聊天室客户端(输入bye可退出聊天室)

  1. package tf.thread;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.Socket;
  6. import java.util.concurrent.ExecutorService;
  7. import java.util.concurrent.Executors;
  8. public class ChatClient {
  9. private static final int PORT = 8888;
  10. private static ExecutorService exec = Executors.newCachedThreadPool();
  11. public static void main(String[] args) throws Exception {
  12. new ChatClient();
  13. }
  14. public ChatClient() {
  15. try {
  16. Socket socket = new Socket("192.168.1.120", PORT);
  17. exec.execute(new Sender(socket));
  18. System.out
  19. .println("【" + socket.getInetAddress() + "】您好,欢迎来到阿飞聊天室!");
  20. BufferedReader br = new BufferedReader(new InputStreamReader(socket
  21. .getInputStream()));
  22. String msg;
  23. while ((msg = br.readLine()) != null) {
  24. System.out.println(msg);
  25. }
  26. } catch (Exception e) {
  27. }
  28. }
  29. /**
  30. * 客户端线程获取控制台输入消息
  31. */
  32. static class Sender implements Runnable {
  33. private Socket socket;
  34. public Sender(Socket socket) {
  35. this.socket = socket;
  36. }
  37. public void run() {
  38. try {
  39. BufferedReader br = new BufferedReader(new InputStreamReader(
  40. System.in));
  41. PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
  42. String msg;
  43. while (true) {
  44. msg = br.readLine();
  45. pw.println(msg);
  46. if (msg.trim().equals("bye")) {
  47. pw.close();
  48. br.close();
  49. exec.shutdownNow();
  50. break;
  51. }
  52. }
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  58. }
声明:ITeye文章版权属于作者,受法律保护。没有作者
 
mina 几句就搞定了的
 
 
http://www.iteye.com/topic/365764
 
 
 
 
 
上一篇:NOIP2012pj文化之旅[floyd]


下一篇:ssh整合之七注解结合xml形式