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();
            }



        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值