NIO和IO
1、BIO
Server端
package com.strive.bio;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 作者:程序猿-南巷清风
* 博客地址:https://blog.csdn.net/weixin_42152604(关注一下下^_^)
* QQ:1821119445 java开发的朋友们可以加(非诚勿扰好吧!)
*/
public class TcpServer {
public static void main(String[] args) throws IOException {
ExecutorService executorService = Executors.newCachedThreadPool();
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
//接收到一个请求,线程池执行一次线程操作,接下来再次等待请求
Socket accept = serverSocket.accept();
executorService.execute(
() -> {
try {
InputStream inputStream = accept.getInputStream();
StringBuilder stringBuilder = new StringBuilder();
while (true) {
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
if (len < 0) {
break;
}
stringBuilder.append(new String(bytes, 0, len));
}
System.out.println(stringBuilder.toString());
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
}
Client端
package com.strive.bio;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
/**
* 作者:程序猿-南巷清风
* 博客地址:https://blog.csdn.net/weixin_42152604(关注一下下^_^)
* QQ:1821119445 java开发的朋友们可以加(非诚勿扰好吧!)
*/
public class TcpClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",8888);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("测试连接".getBytes());
socket.close();
}
}
2、NIO
Server端
package com.strive.nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
/**
* 作者:程序猿-南巷清风
* 博客地址:https://blog.csdn.net/weixin_42152604(关注一下下^_^)
* QQ:1821119445 java开发的朋友们可以加(非诚勿扰好吧!)
*/
public class Server {
public static void main(String[] args) throws IOException {
//1、创建通道
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//2、设置阻塞模式是非阻塞
serverSocketChannel.configureBlocking(false);
//3、绑定连接
serverSocketChannel.bind(new InetSocketAddress(8888));
//4、拿取选择器
Selector selector = Selector.open();
//5、将通道注册到选择器"并且制定监听接受事件"
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
//6、轮训式 获取选择 “已准备就绪”的事件
while(selector.select()>0){
//7、获取当前选择器所有注册的“已经就绪的监听事件”
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()){
//8、获取准备就绪的事件
SelectionKey selectionKey = iterator.next();
//9、判断具体是什么事件准备就绪
if(selectionKey.isAcceptable()){
//10、若“接受就绪”,获取客户端连接
SocketChannel channel = serverSocketChannel.accept();
//11、设置阻塞模式
channel.configureBlocking(false);
//12、将该通道注册到服务器上
channel.register(selector,SelectionKey.OP_READ);
}else if(selectionKey.isReadable()){
//13、获取当前选择器“就绪”状态通道
SocketChannel channel = (SocketChannel) selectionKey.channel();
//14、读取数据
ByteBuffer buffer = ByteBuffer.allocate(1024);
int len = 0;
while((len = channel.read(buffer))>0){
buffer.flip();
System.out.println(new String(buffer.array(),0,len));
buffer.clear();
}
}
}
iterator.remove();
}
}
}
Client端
package com.strive.nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.Date;
import java.util.Scanner;
/**
* 作者:程序猿-南巷清风
* 博客地址:https://blog.csdn.net/weixin_42152604(关注一下下^_^)
* QQ:1821119445 java开发的朋友们可以加(非诚勿扰好吧!)
*/
public class Client {
public static void main(String[] args) throws IOException {
//1、创建通道
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8888));
//2、设置阻塞模式是非阻塞
socketChannel.configureBlocking(false);
//3、指定缓冲区大小
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
String str = scanner.next();
byteBuffer.put((new Date().toString()+"\n"+str).getBytes());
//切换读取模式
byteBuffer.flip();
socketChannel.write(byteBuffer);
byteBuffer.clear();
}
socketChannel.close();
}
}
浙公网安备 33010602011771号