在网络编程中,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)模式,它使用单线程处理多个连接,大大降低了系统资源的消耗,提高了并发性能。
本文来自极简博客,作者:糖果女孩,转载请注明原文链接:BIO中的Socket编程实践:同步阻塞通信