一、传统IO
参考博客:https://blog.csdn.net/a78270528/article/details/80318571
1、单向通信(客户端向服务端发消息)
(1)服务端实现代码
package com.demo.io;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class IOServer1 {
public static void main(String[] args) {
try {
// 服务端永不关闭
@SuppressWarnings("resource")
ServerSocket server = new ServerSocket(4444);
/**
* 服务器死循环,一直等待客户端连接
*/
while (true) {
System.out.println("server is waiting for connection ...");
/**
* 获取连接
*/
Socket socket = server.accept();
System.out.println("---已接到客户端连接");
/**
* 获取输入流读取消息
*/
InputStream is = socket.getInputStream();
StringBuilder sb = new StringBuilder();
byte[] bytes = new byte[1024];
int len = 0;
while (-1 != (len = is.read(bytes))) {
sb.append(new String(bytes, 0, len, "UTF-8"));
}
System.out.print("---收到客户端消息:");
System.out.println(sb);
/**
* 关闭输入流和连接
*/
is.close();
socket.close();
System.out.println("---已断开客户端连接");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)客户端实现代码
package com.demo.io;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class IOClient1 {
public static void main(String[] args) {
try {
/**
* 建立与服务端连接
*/
Socket socket = new Socket("127.0.0.1", 4444);
System.out.println("已建立与服务端连接");
/**
* 获取输出流发送消息
*/
OutputStream os = socket.getOutputStream();
String message = "This's a message from client.";
os.write(message.getBytes("UTF-8"));
System.out.println("已向服务端发送消息");
/**
* 关闭输出流和连接
*/
os.close();
socket.close();
System.out.println("已关闭与服务端连接");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、双向通信(客户端与服务端相互发消息)
(1)服务端实现代码
package com.demo.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class IOServer2 {
public static void main(String[] args) {
try {
// 服务端永不关闭
@SuppressWarnings("resource")
ServerSocket server = new ServerSocket(8888);
/**
* 服务器死循环,一直等待客户端连接
*/
while (true) {
System.out.println("server is waiting for connection ...");
/**
* 获取连接
*/
Socket socket = server.accept();
System.out.println("---已接到客户端连接");
/**
* 获取输入流读取消息
*/
InputStream is = socket.getInputStream();
StringBuilder sb = new StringBuilder();
byte[] bytes = new byte[1024];
int len = 0;
while (-1 != (len = is.read(bytes))) {
sb.append(new String(bytes, 0, len, "UTF-8"));
}
System.out.print("---收到客户端消息:");
System.out.println(sb);
/**
* 获取输出流发送消息
*/
OutputStream os = socket.getOutputStream();
String message = "服务端收到你的消息了";
os.write(message.getBytes("UTF-8"));
// 写入输出流结束标记,否则客户端读取时将阻塞在read()方法中
socket.shutdownOutput();
System.out.println("---已向客户端回复消息");
/**
* 关闭资源断开连接
*/
is.close();
os.close();
socket.close();
System.out.println("---已断开客户端连接");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)客户端实现代码
package com.demo.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class IOServer2 {
public static void main(String[] args) {
try {
// 服务端永不关闭
@SuppressWarnings("resource")
ServerSocket server = new ServerSocket(8888);
/**
* 服务器死循环,一直等待客户端连接
*/
while (true) {
System.out.println("server is waiting for connection ...");
/**
* 获取连接
*/
Socket socket = server.accept();
System.out.println("---已接到客户端连接");
/**
* 获取输入流读取消息
*/
InputStream is = socket.getInputStream();
StringBuilder sb = new StringBuilder();
byte[] bytes = new byte[1024];
int len = 0;
while (-1 != (len = is.read(bytes))) {
sb.append(new String(bytes, 0, len, "UTF-8"));
}
System.out.print("---收到客户端消息:");
System.out.println(sb);
/**
* 获取输出流发送消息
*/
OutputStream os = socket.getOutputStream();
String message = "服务端收到你的消息了";
os.write(message.getBytes("UTF-8"));
// 写入输出流结束标记,否则客户端读取时将阻塞在read()方法中
socket.shutdownOutput();
System.out.println("---已向客户端回复消息");
/**
* 关闭资源断开连接
*/
is.close();
os.close();
socket.close();
System.out.println("---已断开客户端连接");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、NIO