阻塞式网络通信小案例:
package com.nio; import com.sun.xml.internal.ws.server.ServerSchemaValidationTube; import org.junit.Test; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; /** * 一、使用NIO完成网络通信的三个核心 * 1.通道(Channel):负责连接 * java.nio.channels.Channel 接口 * |--SelectableChannel * |--SocketChannel * |--ServerSocketChannel * |--DatagramChannel * * |--Pipe.SinkChannel * |--Pipe.SourceChannel * * 2.缓存区(Buffer):负责数据的存取 * 3.选择器(Selector):是SelectableChannel 的多路复用器。用于监控SelectableChannel的IO状况 * * 注意:在启动的时候,先启动服务端,再启动客户端 */ public class TestBlockingNIO { //客户端 @Test public void client() throws IOException { //1.获取通道 SocketChannel sChannel = SocketChannel.open( new InetSocketAddress( "127.0.0.1" , 9898 )); FileChannel inChannel = FileChannel.open(Paths.get( "1.jpg" ), StandardOpenOption.READ); //2.分配指定大小的缓存区 ByteBuffer buf = ByteBuffer.allocate( 1024 ); //3.读取本地文件,并发送到服务器端 while (inChannel.read(buf)!=- 1 ){ buf.flip(); sChannel.write(buf); buf.clear(); } //4.关闭通道 inChannel.close(); sChannel.close(); } //服务端 @Test public void server() throws IOException { //1.获取通道 ServerSocketChannel ssChannel = ServerSocketChannel.open(); FileChannel outChannel = FileChannel.open(Paths.get( "2.jpg" ), StandardOpenOption.WRITE, StandardOpenOption.CREATE); //如果存在的话,就进行覆盖\ //2.绑定连接 ssChannel.bind( new InetSocketAddress( 9898 )); //3.获取客户端连接的通道 SocketChannel sChannel = ssChannel.accept(); //4.分配指定大小的缓存区 ByteBuffer buf = ByteBuffer.allocate( 1024 ); //5.接收客户端的数据,并保存到本地 while (sChannel.read(buf)!=- 1 ){ buf.flip(); outChannel.write(buf); buf.clear(); } //6.关闭通道 sChannel.close(); outChannel.close(); ssChannel.close(); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2020-02-20 (十四)MySQL语法-子查询(二)
2020-02-20 SQL语句复习--group by 的用法
2020-02-20 公司框架--增值税开票显示