/** * 實現一對多聊天室的服務端 * */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * 接受客戶端發送消息的線程類 */ class ChatReceive extends Thread{ private Socket socket; public ChatReceive(Socket socket){ this.socket = socket; } @Override public void run() { this.receiveMsg(); } /** * 實現接收客戶端發來的消息 */ private void receiveMsg(){ BufferedReader br = null; try{ br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while(true){ String msg = br.readLine(); synchronized ("abc"){ //把讀取到的數據寫入公共數據區 ChatRoomServer.buf = "[" + socket.getInetAddress()+ "] " + msg; //喚醒發送消息的線程 "abc".notifyAll(); } } }catch (Exception e){ e.printStackTrace(); }finally { if(br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } /** * 向客戶端發送消息的線程類 */ class ChatSend extends Thread{ private Socket socket; public ChatSend(Socket socket){ this.socket = socket; } @Override public void run() { this.sendMsg(); } /** * 將公共數據區的消息發送給客戶端 */ private void sendMsg(){ PrintWriter pw = null; try{ pw = new PrintWriter(socket.getOutputStream()); while(true){ synchronized ("abc"){ //讓發送消息的線程處於等待狀態 "abc".wait(); pw.println(ChatRoomServer.buf); pw.flush(); } } }catch (Exception e){ e.printStackTrace(); }finally { if(pw != null){ pw.close(); } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } public class ChatRoomServer { //定義公共數據區 public static String buf; public static void main(String[] args) { System.out.println("Chat Server Version 1.0"); System.out.println("Listen at 8888...."); ServerSocket serverSocket = null; try{ serverSocket = new ServerSocket(8888); while(true){ Socket socket = serverSocket.accept(); System.out.println("鏈接到: " + socket.getInetAddress()); new ChatReceive(socket).start(); new ChatSend(socket).start(); } }catch (Exception e){ e.printStackTrace(); }finally { if(serverSocket != null){ try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } /** * 實現一對多聊天室的客戶端 * */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * 發送消息線程 */ class Send extends Thread{ private Socket socket; private Scanner scanner; private String name; public Send(Socket socket,Scanner scanner,String name){ super(name); this.socket = socket; this.scanner = scanner; } /** * 發送消息方法 */ private void sendMsg(){ PrintWriter pw = null; try{ pw = new PrintWriter(socket.getOutputStream()); while(true){ System.out.print("\n請 "+this.getName()+" 輸入消息:"); String msg = scanner.nextLine(); pw.println(msg); pw.flush(); } }catch (Exception e){ e.printStackTrace(); }finally { if(pw != null){ pw.close(); } if(scanner != null){ scanner.close(); } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Override public void run() { this.sendMsg(); } } /** * 接受消息線程 */ class Receive extends Thread{ private Socket socket; private String name; public Receive(Socket socket,String name){ super(name); this.socket = socket; } /** * 接受消息方法 */ private void receiveMsg(){ BufferedReader br = null; try{ br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while(true){ String msg = br.readLine(); System.out.println("\n" + this.getName() + " 接受信息爲:" + msg); } }catch (Exception e){ e.printStackTrace(); }finally { if(br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Override public void run() { this.receiveMsg(); } } public class ChatRoomClient { public static void main(String[] args) { Scanner scanner = null; ServerSocket serverSocket = null; Socket socket = null; try{ //建立Scanner對象 scanner = new Scanner(System.in); System.out.println("請輸入:Server,<port> 或者:<ip>,<port>"); String str = scanner.nextLine(); String[] arrStr = str.split(","); if("Server".equals(arrStr[0])){ //啓動服務端 System.out.println("TCP Server Listen at " + arrStr[1] + "..."); serverSocket = new ServerSocket(Integer.parseInt(arrStr[1])); socket = serverSocket.accept(); System.out.println("鏈接成功!"); }else{ //啓動客戶端 socket = new Socket(arrStr[0],Integer.parseInt(arrStr[1])); System.out.println("鏈接成功"); } new Send(socket,scanner,arrStr[0]).start(); new Receive(socket,arrStr[0]).start(); }catch (Exception e){ e.printStackTrace(); }finally { if(serverSocket != null){ try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }