BIO的代码实现,客户端以及服务端

本文最后更新于:6 天前

BIO-同步阻塞IO,直接上代码。

服务端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {

    public static void main(String[] args) {

        try {
          // 绑定端口
            ServerSocket socket = new ServerSocket(8082);
            while (true) {
                System.out.println("等待客户端连接...");
                // 同步阻塞,直到建立连接,意思就是在这里会堵塞,如果没有客户端连接的话,
                // 代码会停在这里。
                Socket client = socket.accept();
                // 有客户端连接了,才会往下执行。
                // 发送一个消息给客户端 ,这里通过输入输出流来进行交互
                OutputStream output = client.getOutputStream();
                output.write(("客户端[" + client.getPort() + "]你好,你已成功连接到8082服务端").getBytes());

                // 刷新缓冲区
                output.flush();
                
                System.out.println("客户端已连接:" + client.getPort());
                try {
                    InputStream input = client.getInputStream();
                    byte[] bytes = new byte[1024];
                    // 同步阻塞 读取客户端数据 直到输入数据,连接之后,又进行堵塞,读取客户端发送的数据。
                    while (input.read(bytes) != -1) {
                        output.write(("收到了你的消息:" + new String(bytes)).getBytes());
                        output.flush();
                        System.out.println("收到客户端消息:" + new String(bytes).trim());
                    }
                } catch (IOException ex) {
                    // 客户端链接断开则引发异常
                    System.err.println("引发异常:" + ex.getMessage());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class SocketClient {

    public static void main(String[] args) {
        try {
            // 接收控制台用户输入的数据
            Scanner scanner = new Scanner(System.in);
            // 要绑定的主机和端口号
            Socket socketClient = new Socket("127.0.0.1", 8082);

            // 启动线程监听服务端发送的消息
            new Thread(() -> {
                try {
                  // 获取输入流,读取服务器发送过来的消息
                    InputStream input = socketClient.getInputStream();
                    byte[] bytes = new byte[1024 * 4];
                    while ((input.read(bytes)) != -1) {
                        System.out.println("收到服务端消息:" + new String(bytes).trim());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
            // 获取输出流,用来向服务器发送消息
            OutputStream output = socketClient.getOutputStream();
            while (true) {
                String str = scanner.nextLine();
                // 一个小tip
                if ("exit".equals(str)) {
                    output.close();
                    socketClient.close();
                    break;
                } else {
                    // 向服务端发送消息
                    output.write(str.getBytes());
                    output.flush();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

很简单的一个小栗子,看一看然后自己瞧一瞧,也会更容易理解。代码可以直接运行的。

看山是山,看山不是山,看山还是山。

IDEA小TIPS:
复制完整的代码文本,在IDEA里可以直接粘贴会根据文本直接生成一个类。

封面

阳光 草地 郊游 坐在草地上的美女 旗袍 鲜花


BIO的代码实现,客户端以及服务端
https://wangijun.com/2022/08/03/net-02/
作者
无良芳
发布于
2022年8月3日
许可协议