IO
IO Server
public class SocketServer {
public static void main(String[] args) {
public static void server1() {
ServerSocket serverSocket = null;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
serverSocket = new ServerSocket(8999);
Socket socket = serverSocket.accept();
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = bufferedReader.readLine();
System.out.println("服务端接收到客户端的消息:" + s);
bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write("服务端发送消息给客户端\n");
} catch (IOException e) {
throw new RuntimeException(e);
if(serverSocket != null) {
} catch (IOException e) {
throw new RuntimeException(e);
if(bufferedWriter != null) {
} catch (IOException e) {
throw new RuntimeException(e);
if (bufferedReader != null) {
} catch (IOException e) {
throw new RuntimeException(e);
public static void server2() {
System.out.println("请输入端口号,并等待客户端连接...");
try (BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
ServerSocket serverSocket = new ServerSocket(Integer.valueOf(consoleReader.readLine()));
Socket socket = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
System.out.println("客户端已连接,开始和客户端交互...");
if (bufferedReader.ready()) {
System.out.println("收到客户端的消息:" + bufferedReader.readLine());
if (consoleReader.ready()) {
printWriter.println(consoleReader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
public static void server3() {
ThreadPoolExecutor pool = new ThreadPoolExecutor(0, Runtime.getRuntime().availableProcessors() * 2,
System.out.println("请输入端口号,并等待客户端连接...");
try (BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
ServerSocket serverSocket = new ServerSocket(Integer.valueOf(consoleReader.readLine()));
Socket socket = serverSocket.accept();
System.out.println("客户端已连接,开始和客户端交互...");
pool.submit(new Thread(()->{
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
if(bufferedReader.ready()) {
System.out.println("收到客户端"+ Thread.currentThread() +"的消息:" + bufferedReader.readLine());
if (consoleReader.ready()) {
printWriter.println(consoleReader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);

IO Client
public class SocketClient {
public static void main(String[] args) {
public static void client1() {
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
socket = new Socket("127.0.0.1", 8999);
bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write("客户端发送消息给服务端\n");
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = bufferedReader.readLine();
System.out.println("客户端接收到服务端的消息:" + s);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
if(bufferedWriter != null) {
} catch (IOException e) {
throw new RuntimeException(e);
if (bufferedReader != null) {
} catch (IOException e) {
throw new RuntimeException(e);
public static void client2() {
System.out.println("请输入端口号:");
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
Socket socket = new Socket("127.0.0.1", Integer.valueOf(consoleReader.readLine()));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("连接成功,开始和服务端交互");
if (bufferedReader.ready()) {
System.out.println("收到服务端的消息:" + bufferedReader.readLine());
if (consoleReader.ready()) {
printWriter.println(consoleReader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
public static void client3() {
System.out.println("请输入端口号:");
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
Socket socket = new Socket("127.0.0.1", Integer.valueOf(consoleReader.readLine()));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("连接成功,开始和服务端交互");
if (bufferedReader.ready()) {
System.out.println("收到服务端的消息:" + bufferedReader.readLine());
if (consoleReader.ready()) {
printWriter.println(consoleReader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);

NIO
NIO Server
public class SocketServer {
public static void main(String[] args) {
private static void server1() {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);
SocketChannel socketChannel = serverSocketChannel.accept();
if(socketChannel != null) {
System.out.println("客户端已连接,开始和客户端交互...");
socketChannel.configureBlocking(false);
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
socketChannel.read(readBuffer);
System.out.println("接收到客户端消息: " + new String(readBuffer.array(), "utf-8").trim());
ByteBuffer writeBuffer = ByteBuffer.wrap("发送消息给客户端".getBytes());
socketChannel.write(writeBuffer);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
private static void server2() {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);
SocketChannel socketChannel = serverSocketChannel.accept();
if(socketChannel != null) {
System.out.println("客户端已连接,开始和客户端交互...");
socketChannel.configureBlocking(false);
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
if(socketChannel.read(readBuffer) > 0) {
System.out.println("接收到客户端消息: " + new String(readBuffer.array(), "utf-8").trim());
if (consoleReader.ready()) {
ByteBuffer writeBuffer = ByteBuffer.wrap(consoleReader.readLine().getBytes());
socketChannel.write(writeBuffer);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
private static void server3() {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);
List socketChannels = new ArrayList<>();
boolean ready = consoleReader.ready();
bytes = consoleReader.readLine().getBytes();
SocketChannel socketChannel = serverSocketChannel.accept();
if (socketChannel != null) {
socketChannels.add(socketChannel);
socketChannel.configureBlocking(false);
System.out.println("客户端已连接,开始和客户端交互...");
for (SocketChannel channel : socketChannels) {
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
if (channel.read(readBuffer) > 0) {
System.out.println("接收到客户端消息: " + new String(readBuffer.array(), "utf-8").trim());
ByteBuffer writeBuffer = ByteBuffer.wrap(bytes);
channel.write(writeBuffer);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
static final List socketChannels4 = new CopyOnWriteArrayList<>();
private static void server4() {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);
SocketChannel socketChannel = serverSocketChannel.accept();
if (socketChannel != null) {
System.out.println("客户端已连接,开始和客户端交互...");
socketChannel.configureBlocking(false);
socketChannels4.add(socketChannel);
Iterator iterator = socketChannels4.iterator();
boolean ready = consoleReader.ready();
byte[] writeBytes = null;
writeBytes = consoleReader.readLine().getBytes();
while (iterator.hasNext()) {
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
SocketChannel channel = iterator.next();
if (channel.read(readBuffer) > 0) {
System.out.println("接收到客户端消息: " + new String(readBuffer.array(), "utf-8").trim());
ByteBuffer writeBuffer = ByteBuffer.wrap(writeBytes);
channel.write(writeBuffer);
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
private static void server5() {
try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
Selector selector = Selector.open();
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
List socketChannels = new ArrayList<>();
Iterator iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
if(selectionKey.isAcceptable()) {
SocketChannel socketChannel = serverSocketChannel.accept();
System.out.println("客户端已连接,开始和客户端交互...");
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
socketChannels.add(socketChannel);
} else if(selectionKey.isReadable()) {
SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
if (socketChannel.read(readBuffer) > 0) {
System.out.println("接收到客户端消息: " + new String(readBuffer.array(), "utf-8").trim());
if(consoleReader.ready()) {
byte[] bytes = consoleReader.readLine().getBytes();
for (SocketChannel socketChannel : socketChannels) {
ByteBuffer writeBuffer = ByteBuffer.wrap(bytes);
socketChannel.write(writeBuffer);
} catch (IOException e) {
throw new RuntimeException(e);

NIO Client
public class SocketClient {
public static void main(String[] args) {
private static void client1() {
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("127.0.0.1", 9999));
while (!socketChannel.finishConnect()) {
System.out.println("正在连接客户端...");
ByteBuffer writeBuffer = ByteBuffer.wrap("向服务端发送消息".getBytes());
socketChannel.write(writeBuffer);
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
if(socketChannel.read(readBuffer) > 0) {
System.out.println("接收到服务端消息: " + new String(readBuffer.array(), "utf-8").trim());
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
private static void client2_3_4() {
SocketChannel socketChannel = SocketChannel.open();
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("127.0.0.1", 9999));
while (!socketChannel.finishConnect()) {
System.out.println("正在连接客户端...");
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
if(socketChannel.read(readBuffer) > 0) {
System.out.println("接收到服务端消息: " + new String(readBuffer.array(), "utf-8").trim());
if (consoleReader.ready()) {
ByteBuffer writeBuffer = ByteBuffer.wrap(consoleReader.readLine().getBytes());
socketChannel.write(writeBuffer);
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
private static void client5() {
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9999));
Selector selector = Selector.open();
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
Iterator iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
if (selectionKey.isReadable()) {
SocketChannel channel = (SocketChannel) selectionKey.channel();
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
if(channel.read(readBuffer) > 0) {
System.out.println("接收到服务端消息: " + new String(readBuffer.array(), "utf-8").trim());
if (consoleReader.ready()){
ByteBuffer writeBuffer = ByteBuffer.wrap(consoleReader.readLine().getBytes());
socketChannel.write(writeBuffer);
} catch (IOException e) {
throw new RuntimeException(e);
