JAVA之IO學習(二)BIO

BIO編程模型

BIO多人聊天

服務端



import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * Created 多人聊天服務端 on 2020/6/28.
 */
public class ChatServer {

    private  int DEFAULT_PORT = 8888;
    private  final String QUIT = "quit";

    private ServerSocket serverSocket = null;
    private Map<Integer,Writer> clients =null;

    public ChatServer() throws IOException {

        clients = new HashMap<>();

    }

    //添加客戶端
    public void addClient(Socket socket) throws IOException {
        if(socket!= null){
            int port = socket.getPort();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            clients.put(port,bufferedWriter);
            System.out.println("客戶端"+port+":加入到了服務端");
        }
    }


    //刪除客戶端
    public void removeClient(Socket socket) throws IOException {
        if(socket!= null){
            int port = socket.getPort();
            if( clients.containsKey(port) ){
                clients.get(port).close();
            }
            clients.remove(port);
            System.out.println("客戶端"+port+":從服務端移除");
        }
    }

    //轉發信息給其他客戶端
    public void forwardMsg(String msg,Socket socket) throws IOException {
        System.out.println("轉發給其它客戶端"+msg);
            int port = socket.getPort();
            for( int clientPort: clients.keySet()){
                if( port != clientPort){
                    Writer writer = clients.get(clientPort);
                    writer.write(msg);
                    writer.flush();
                }
            }


    }


    //服務端啓動
    public void start() {
        try {
            serverSocket = new ServerSocket(DEFAULT_PORT);
            System.out.println("服務器開始啓動默認監聽端口"+DEFAULT_PORT);

            while(true){
                //開處理客戶連接的任務線程
                Socket socket = serverSocket.accept();

                new Thread(new ChatHandler(this,socket)).start();

            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) throws IOException {
        new ChatServer().start();
    }
}





import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * Created by Founder on 2020/6/28.
 */
public class ChatHandler implements  Runnable{

    private ChatServer chatServer;

    private Socket socket ;

    private final String QUIT ="quit" ;

    public ChatHandler(ChatServer chatServer, Socket socket ){
        this.chatServer = chatServer;
        this.socket = socket ;
    }
    @Override
    public void run() {
        System.out.println("客戶端"+socket.getPort()+"已經連接");
        try {
            chatServer.addClient(socket);
            //讀取客戶端的信息
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String msg =null;
            while ((msg=reader.readLine())!=null){
                String clientMsg = "客戶端"+socket.getPort()+"發送了一條消息:"+msg;
                System.out.println(clientMsg);
                //將消息轉發給其它客戶端
                chatServer.forwardMsg(msg,socket);
                //查看用戶是否要退出
               if(readeyToQuit(msg)){
                   break;
               }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public boolean readeyToQuit(String msg){
        return QUIT.equals(msg);
    }
}

 客戶端



import java.io.*;
import java.net.Socket;

/**
 * Created 客戶端 2020/6/28.
 */
public class ChatClient {

    final String QUIT = "quit" ;
    final  String DEFAULT_SERVER_HOST = "127.0.0.1";
    final  int DEFAULT_PORT = 8888;
    Socket socket = null;

    private BufferedReader reader;
    private BufferedWriter writer;

    //發送消息給服務器
    public void send(String msg) throws IOException {
        System.out.println("發送給服務器"+msg);
        if(!socket.isOutputShutdown()){
        writer.write(msg+"\n");
        writer.flush();
        }
    }


    //接受消息從服務器
    public String recive() throws IOException {
        if(!socket.isInputShutdown()){
            String msg = reader.readLine();
            System.out.println("從服務器接受"+msg);
            return msg;
        }
        return null;
    }

    //檢查用戶是否退出
    public boolean readToQuit(String msg){
        return QUIT.equals(msg);
    }

    //啓動客戶端
    public void start(){
        try {
            socket = new Socket(DEFAULT_SERVER_HOST,DEFAULT_PORT);
            System.out.println("客戶端開始啓動默認端口"+DEFAULT_PORT);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //處理客戶端的輸入
            new Thread(new UserInputHandler(this)).start();
            //讀取服務器轉發的消息
            String msg = null;
            while(((msg = recive() )!= null)){
                System.out.println(msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new ChatClient().start();
    }
}




import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * Created 用戶輸入處理 2020/6/28.
 */
public class UserInputHandler implements Runnable{
    final String QUIT = "quit" ;
        private  ChatClient chatClient;
        public UserInputHandler( ChatClient chatClient ){
            this.chatClient = chatClient ;
        }
    @Override
    public void run() {
        BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        while (true){

            //先發給服務端
            try {
                chatClient.send(consoleReader.readLine());
                chatClient.readToQuit(consoleReader.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }



        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章