基本介绍

工作机制

BIO编程简单流程

案例

package cn.meowrain.bio;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public class BIOServer {
public static void main(String[] args) {
new BIOServer().start(6666);
}
public void start(int port) {
AtomicInteger counter = new AtomicInteger(1);
ThreadPoolExecutor pool = new ThreadPoolExecutor(
3,
6,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(50),
r -> {
Thread t = new Thread(r);
t.setName("bio-worker-" + counter.getAndIncrement());
t.setDaemon(false);
t.setUncaughtExceptionHandler((thread, ex) ->
System.err.println("[ERROR] " + thread.getName() + " 出现异常:" + ex.getMessage())
);
return t;
},
new ThreadPoolExecutor.CallerRunsPolicy()
);
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("🚀 BIO服务器启动成功,监听端口:" + port);
while (true) {
System.out.println("等待客户端连接...");
Socket socket = serverSocket.accept();
System.out.println("✅ 客户端已连接:" + socket.getRemoteSocketAddress());
pool.execute(() -> handleClient(socket));
}
} catch (IOException e) {
System.err.println("服务器启动异常:" + e.getMessage());
}
}
private void handleClient(Socket socket) {
System.out.println("🧵 线程启动:" + Thread.currentThread().getName());
try (InputStream inputStream = socket.getInputStream()) {
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
String msg = new String(buffer, 0, len);
System.out.println("📨 收到来自 " + socket.getRemoteSocketAddress() + " 的消息:" + msg.trim());
}
} catch (IOException e) {
System.err.println("⚠️ 客户端 " + socket.getRemoteSocketAddress() + " 断开连接。");
} finally {
try {
socket.close();
System.out.println("🔌 关闭连接:" + socket.getRemoteSocketAddress());
} catch (IOException e) {
System.err.println("关闭连接异常:" + e.getMessage());
}
}
}
}
