歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java簡易聊天室

Java簡易聊天室

日期:2017/3/1 10:38:46   编辑:Linux編程
支持多人向服務器端發送消息並由服務器發送至各個客戶端

服務器端代碼:

[java]
  1. /*
  2. * @topic:服務器端
  3. */
  4. import java.io.*;
  5. import java.net.*;
  6. import java.util.List;
  7. import java.util.ArrayList;
  8. import java.util.concurrent.ExecutorService;
  9. import java.util.concurrent.Executors;
  10. public class Server{
  11. //服務器端口
  12. private static final int SERVERPORT = 8889 ;
  13. //客戶端連接
  14. private static List<Socket> mClientList = new ArrayList<Socket>();
  15. //線程池
  16. private ExecutorService mExecutorService;
  17. //ServerSocket對象
  18. private ServerSocket mServerSocket;
  19. public static void main(String[] args){
  20. //System.out.println("Hello Landor!");
  21. new Server();
  22. }
  23. public Server(){
  24. try{
  25. //設置服務器端口
  26. mServerSocket = new ServerSocket(SERVERPORT);
  27. //創建一個線程池
  28. mExecutorService = Executors.newCachedThreadPool();
  29. System.out.println("wait client :");
  30. //用來臨時保存客戶端連接的Socket對象
  31. Socket client = null;
  32. while(true){
  33. //接收客戶連接並添加到List中
  34. client = mServerSocket.accept();
  35. mClientList.add(client);
  36. //開啟一個客戶端線程
  37. mExecutorService.execute(new ThreadServer(client));
  38. }
  39. }catch(IOException e){
  40. e.printStackTrace();
  41. }
  42. }
  43. //每個客戶端單獨開啟一個線程
  44. static class ThreadServer implements Runnable{
  45. private Socket mSocket;
  46. private BufferedReader mBufferedReader;
  47. private PrintWriter mPrintWriter;
  48. private String mStrMSG;
  49. public ThreadServer(Socket socket) throws IOException{
  50. this.mSocket = socket;
  51. mBufferedReader = new BufferedReader(new InputStreamReader(
  52. socket.getInputStream()));
  53. mStrMSG = "user: "+this.mSocket.getInetAddress()+" come total:"
  54. + mClientList.size();
  55. sendMessage();
  56. }
  57. public void run(){
  58. try{
  59. while((mStrMSG = mBufferedReader.readLine())!=null){
  60. if(mStrMSG.trim().equals("exit")){
  61. //當一個客戶端退出時
  62. mClientList.remove(mSocket);
  63. mBufferedReader.close();
  64. mPrintWriter.close();
  65. mStrMSG = "user:" + this.mSocket.getInetAddress()
  66. + " exit total:" + mClientList.size();
  67. mSocket.close();
  68. sendMessage();
  69. break;
  70. }else{
  71. mStrMSG = mSocket.getInetAddress() + ":" + mStrMSG;
  72. sendMessage();
  73. }
  74. }
  75. }catch(IOException e){
  76. e.printStackTrace();
  77. }
  78. }
  79. //發送消息給所有客戶端
  80. private void sendMessage() throws IOException {
  81. System.out.println(mStrMSG);
  82. for(Socket client : mClientList){
  83. mPrintWriter = new PrintWriter(client.getOutputStream(),true);
  84. mPrintWriter.println(mStrMSG);
  85. }
  86. }
  87. }
  88. }

客戶端:

[java]
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.io.PrintWriter;
  4. import java.net.Socket;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. /*
  8. * @topic:客戶端
  9. */
  10. public class Client{
  11. private static final int PORT = 8889;
  12. private static ExecutorService exec = Executors.newCachedThreadPool();
  13. public static void main(String[] args) throws Exception{
  14. //System.out.println("Hello Landor!");
  15. new Client();
  16. }
  17. public Client(){
  18. try{
  19. Socket socket = new Socket("localhost",PORT);
  20. exec.execute(new Sender(socket));
  21. BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  22. String msg;
  23. while((msg = br.readLine())!=null){
  24. System.out.println(msg);
  25. }
  26. }catch(Exception e){
  27. e.printStackTrace();
  28. }
  29. }
  30. //客戶端線程獲取控制台輸入消息
  31. static class Sender implements Runnable{
  32. private Socket socket;
  33. public Sender(Socket socket){
  34. this.socket = socket;
  35. }
  36. public void run(){
  37. try{
  38. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  39. PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
  40. while(true){
  41. String msg = br.readLine();
  42. pw.println(msg);
  43. if (msg.trim().equals("exit")) {
  44. pw.close();
  45. br.close();
  46. exec.shutdownNow();
  47. break;
  48. }
  49. }
  50. }catch(Exception e){
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55. }
Copyright © Linux教程網 All Rights Reserved