BIO中的Socket编程实践:同步阻塞通信

糖果女孩 2021-01-11 ⋅ 15 阅读

在网络编程中,Socket是一种提供网络通信的接口,使得不同计算机之间可以进行数据交互。Java提供了一套Socket编程的API,其中常用的是BIO(Blocking IO)模式。

什么是BIO

BIO是一种同步阻塞的通信模式,它的特点是在进行网络通信时,如果服务器端没有数据可以读取,那么客户端将一直等待,直到服务器返回数据或发生超时。在BIO模式下,每个连接都需要单独的线程来处理,因此在并发量大的情况下,会消耗大量的系统资源。

Socket编程实践

首先,我们创建一个简单的服务器端,用于接收客户端的请求并返回数据。

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

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8080);
        System.out.println("Server started on port 8080");

        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("Client connected: " + socket.getInetAddress());

            InputStream inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int len = inputStream.read(buffer);

            String message = new String(buffer, 0, len);
            System.out.println("Received message from client: " + message);

            OutputStream outputStream = socket.getOutputStream();
            String response = "Hello from server!";
            outputStream.write(response.getBytes());

            socket.close();
            System.out.println("Client disconnected");
        }
    }
}

接下来,我们创建一个客户端,用于连接服务器并发送请求。

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

public class Client {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("localhost", 8080);
        System.out.println("Connected to server");

        OutputStream outputStream = socket.getOutputStream();
        String request = "Hello from client!";
        outputStream.write(request.getBytes());

        InputStream inputStream = socket.getInputStream();
        byte[] buffer = new byte[1024];
        int len = inputStream.read(buffer);

        String response = new String(buffer, 0, len);
        System.out.println("Received response from server: " + response);

        socket.close();
        System.out.println("Disconnected from server");
    }
}

在以上代码中,我们首先创建了一个ServerSocket对象绑定到本地端口8080,然后通过accept()方法等待客户端连接。当有客户端连接时,我们创建一个新的Socket对象来处理连接,并获取输入流读取客户端发送的数据,然后将响应数据通过输出流发送给客户端。最后我们关闭Socket连接。

客户端的实现比较简单,首先创建一个Socket对象连接服务器,然后获取输出流发送请求数据,再通过输入流读取服务器返回的响应数据。最后关闭Socket连接。

运行程序

我们可以通过命令行分别运行服务器和客户端程序,来验证BIO模式下的同步阻塞通信。

# 启动服务器
java Server

# 启动客户端
java Client

在服务器端的控制台,我们可以看到客户端连接的信息,以及接收到的客户端请求数据。在客户端的控制台,我们可以看到连接服务器的信息以及收到的服务器响应数据。

总结

BIO模式是一种简单易懂的网络通信方式,适用于并发数量较小的情况。但在高并发场景下,BIO模式由于每个连接都需要独立线程的问题,会导致系统资源消耗较大,因此不适合用于生产环境。在下一篇博客中,我们将介绍NIO(Non-blocking IO)模式,它使用单线程处理多个连接,大大降低了系统资源的消耗,提高了并发性能。


全部评论: 0

    我有话说: