服务端
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
import java.util.Set;
public class NIOServer {
public void start(){
try{
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.bind(new InetSocketAddress(8088));
Selector selector = Selector.open();
serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);
while (true){
selector.select();
Set<SelectionKey> keySet = selector.selectedKeys();
for (SelectionKey key: keySet){
if (key.isAcceptable()){
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel socketChannel = ssc.accept();
if (socketChannel==null){
continue;
}
socketChannel.configureBlocking(false);
socketChannel.register(selector,SelectionKey.OP_READ);
System.out.println("一个客户端链接了");
}else if (key.isReadable()){
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
sc.read(buffer);
buffer.flip();
if (buffer.limit()==0){
buffer.clear();
continue;
}
byte[] data = new byte[buffer.limit()];
buffer.get(data);
String message = new String(data, StandardCharsets.UTF_8);
System.out.println("客户端说:"+message);
}
}
}
}catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
NIOServer server = new NIOServer();
server.start();
}
}
客户端
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Client {
private Socket socket;
public Client(){
try {
System.out.println("正在连接服务端...");
socket = new Socket("localhost",8088);
System.out.println("与服务端建立链接!");
}catch (IOException e){
e.printStackTrace();
}
}
public void start(){
ServerHandler handler = new ServerHandler();
Thread t = new Thread(handler);
t.setDaemon(true);
t.start();
try{
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw,true);
Scanner scanner = new Scanner(System.in);
System.out.println("请开始输入内容,单独输入exit退出。");
while (true){
String line = scanner.nextLine();
if ("exit".equals(line)){
break;
}
pw.println(line);
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private class ServerHandler implements Runnable{
public void run(){
try {
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine())!=null){
System.out.println(line);
}
}catch (IOException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Client client = new Client();
client.start();
}
}