Java IO流知识回顾,使用 BIO 实现简易的多线程版本客户端服务器聊天室

这是一个简单的Java聊天室实现,利用java.io包的API和多线程,服务器端创建ServerSocket监听客户端连接,每个连接创建单独线程处理。客户端发送消息后会进入阻塞状态,等待服务器响应。代码中包含了服务器端和客户端的处理逻辑,适合回顾IO流知识。由于其阻塞特性,实用性有限。

前言

使用java.io包下的 API 加多线程实现的简易聊天室,由于属于阻塞式 IO,所以客户端发一条消息后就进入阻塞状态,必须等待服务器的回复,服务器也是同理。所以实用性为 0,全当是回顾一下 IO 流的知识点,也没什么难度,如果是第一次接触或者遇到了问题,建议想把思路想清楚在写代码(自己在写的时候也总被输入输出搞懵)

代码实现

服务器端代码

public class ThreadServer {
    public static void main(String[] args) {

        try (
                // 1. 创建服务器ServerSocket
                ServerSocket ss = new ServerSocket(9999);
        ) {
            // 2. 死循环,监听客户端连接
            while (true) {
                Socket socket = ss.accept();
                System.out.println("收到来自:" + socket.getRemoteSocketAddress() + " 的连接");
                // 3. 为每个连接创建一个线程来处理
                Thread thread = new Handler(socket);
                thread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
class Handler extends Thread {
    private Socket socket;

    public Handler(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try (
                InputStream is = this.socket.getInputStream();
                OutputStream os = this.socket.getOutputStream();
        ) {
            handle(is, os);
        } catch (Exception e) {
            try {
                this.socket.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
            System.out.println(this.socket.getRemoteSocketAddress() + " 关闭了连接");
        }
    }
    private void handle(InputStream is, OutputStream os) throws IOException {
        // 输入流:读取客户端消息
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        // 输出流:向客户端发送消息
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
        Scanner sc = new Scanner(System.in);
        bw.write("hello\n");
        bw.flush();
        while (true) {
            // 读取客户端发送的内容
            String s = br.readLine();
            System.out.println("[Client "+ this.socket.getRemoteSocketAddress() + "]: " + s);
            if (s.equals("bye")) {
                bw.write("bye\n");
                bw.flush();
                break;
            }
            System.out.print("请输入>>> :");
            // 向客户端发送内容
            String msg = sc.nextLine();
            bw.write(msg + "\n");
            bw.flush();
        }
    }
}

客户端代码

public class Client {
    public static void main(String[] args) {
        try (
                // 1. 创建客户端Socket
                Socket socket = new Socket("localhost", 9999);
                // 2. 输入流,读取服务器消息
                InputStream is = socket.getInputStream();
                // 3. 输出流,向服务器发送消息
                OutputStream os = socket.getOutputStream();
        ) {
            hanlder(is, os);
        } catch (Exception e) {
            System.out.println("Fail!");
        }
    }
    private static void hanlder(InputStream is, OutputStream os) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
        Scanner sc = new Scanner(System.in);
        System.out.println("[server]:" + br.readLine());
        while (true) {
            System.out.print("请输入>>> :");
            String s = sc.nextLine();
            // 写给服务器
            bw.write(s);
            bw.newLine();
            bw.flush();
            String msg = br.readLine();
            System.out.println("[Server]: " + msg);
            if (msg.equals("bye")) {
                break;
            }
        }
    }
}

虽菜但练

如果大佬觉得哪里有问题欢迎评论区指正,请不要使用阴阳怪气、嘲讽、不怀好意的词语,非常感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值