做這個項目前需要先做好分析: 聊天室分為兩個模組,伺服器和用戶端。 伺服器主要實現邏輯是:用戶端第一次進入聊天室列印歡迎日誌、接收用戶端的訊息列印在聊天室中、群發給其他使用者、判斷私聊的條件。 用戶端主要實現邏輯是:初始化資訊、發送訊息給伺服器、接收來自伺服器的訊息。 項目從簡單版本往上寫,逐步增加功能: 第一個版本:通過TCP搭建伺服器和用戶端,一個用戶端上線伺服器就列印一條上線提示。 第二個版本:用戶端發送一條訊息,伺服器接收一條,並反饋一條已接收的資訊給用戶端。 第三個版本:通過多線程使用戶端能不斷給伺服器發送訊息,伺服器也能不斷回複用戶端的資訊。 第四個版本:多個用戶端開啟時,自身發送的訊息由伺服器發給其他所有用戶端,在聊天室中列印出以用戶端姓名為首碼的每個人發出的訊息。 第五個版本:判斷哪些是私聊的資訊,私聊資訊既不列印在聊天室中也只會發送給目前使用者的私聊對象。完善代碼。 伺服器代碼:來一個用戶端就開啟一個伺服器線程。具體邏輯放線上程中完成。 public class Server { public static void main(String[] args ) throws IOException { List< ServerThread> list = new ArrayList<ServerThread>(); //判斷私聊時需要知道發送給哪個用戶端,所以把為每一個用戶端服務的線程放入一個集合中。以此來遍曆所以用戶端。 ServerSocket serverSocket = new ServerSocket(8080); while ( true ){ Socket socket = serverSocket .accept(); ServerThread serverThread = new ServerThread( socket , list ); //開啟線程時把當前用戶端對應通訊端和裝有所有serverThread對象的集合傳遞給為當前用戶端服務的線程。 list .add( serverThread ); //開啟一個就往list中添加一個。 serverThread .start(); } } } 用戶端代碼:讀入鍵盤輸入資料,發送給伺服器,並接收來自伺服器的訊息。讀和寫分別使用不同的線程。 public class Client { public static void main(String[] args ) throws UnknownHostException, IOException { Socket socket = new Socket( "10.2.155.91" , 8080); //通過伺服器ip地址和伺服器連接埠號碼建立與伺服器的串連。 WriterThread writerThread = new WriterThread( socket ); //開啟一個寫線程發送資料到伺服器。 writerThread .start(); ReaderThread readerThread = new ReaderThread( socket ); //開啟一個讀線程接收來自伺服器的訊息。 readerThread .start(); } } 伺服器線程代碼: public class ServerThread extends Thread{ private Socket socket ; private BufferedReader bReader ; private BufferedWriter bWriter ; private List<ServerThread> list ; private String name ; public ServerThread(Socket socket ,List<ServerThread> list ) { try { this . socket = socket ; this . list = list ; bReader = new BufferedReader( new InputStreamReader( socket .getInputStream())); bWriter = new BufferedWriter( new OutputStreamWriter( socket .getOutputStream())); } catch (IOException e ) { e .printStackTrace(); } } public void run() { WelcomeChat(); try { while ( true ){ String info = bReader .readLine(); if ( info .startsWith( "@" )&& info .indexOf( "#" ) !=-1&& info .indexOf( "#" )- info .indexOf( "@" )>1) { SendByName( info ); } else { System. out .println( name + "說:" + info ); SendToOthers( info ); } } } catch (IOException e