一對多聊天室

/**
* 實現一對多聊天室的服務端
* 
*/
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();
                }
            }
        }
    }
}
相關文章
相關標籤/搜索