代码拉取完成,页面将自动刷新
同步操作将从 eric_1989/jnet 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
##Jfire-jnet是什么 Jfire-jnet(以下简称jnet)是一个简单却强大的socket框架。底层基于AIO提供强大的网络能力。可以实现在单机上数个线程(个位数)管理十万级别以上的长连接。框架屏蔽了socket的复杂性,为开发者提供了异常简单的编程模型。但是在简单的背后,却蕴藏着强大的控制能力。Jfire-jnet的优点有以下几个
##Jfire-jnet快速入门 下面展示一个简单的例子让大家对jnet有一个直观的印象。
class myInitListener implements ChannelInitListener
{
// 当通道被建立的时候触发
@Override
public void channelInit(ServerChannelInfo serverChannelInfo)
{
// 可以设置通道的读取超时时长。默认为3000毫秒
serverChannelInfo.setReadTimeout(3000);
// 可以设置通道无数据的读取等待时长。默认为30分钟
serverChannelInfo.setWaitTimeout(1000 * 60 * 30);
// 设置数据流的处理器,这步是最重要的,也是业务逻辑的所在。每一个通道的处理器都是通过这种方式新建而来。所以其中的数据都是针对该通道的
serverChannelInfo.setHandlers(new DataHandler() {
// 这样的数据都是只针对该通道的。因此这种结构很方便用来做登录拦截之类的
private String loginName;
// data是上一个处理器传递过来的数据,返回值是要给下一个处理器的数据。如果是最开头的处理器,则data就是包解码器解码出来的一个完整报文
@Override
public Object handle(Object data, InternalResult result) throws SocketException
{
ByteBuf<?> buf = (ByteBuf<?>) data;
System.out.println("收到消息:"+buf.readString(Charset.forName("utf8")));
buf.release();
return "客户端你好,我收到消息了";
}
}, new DataHandler() {
@Override
public Object handle(Object data, InternalResult result) throws SocketException
{
// 这里的data就是上一个处理器返回的数据了。处理器之间的顺序就是在代码中他们初始化的顺序
String value = (String) data;
// 从内存缓存池中获取一个内存缓存区用来写出数据
ByteBuf<?> buf = DirectByteBufPool.getInstance().get(100);
buf.writeString(value, Charset.forName("utf8"));
buf.writeByte((byte) '\r');
buf.writeByte((byte) '\n');
// 末尾的处理器一定要返回ByteBuf类型的数据。这样框架就会自动将这个数据通过socket发送出去
return buf;
}
});
}
}
public class BaseServerTest
{
private Logger logger = ConsoleLogFactory.getLogger(ConsoleLogFactory.DEBUG);
@Test
public void test() throws IOException, InterruptedException, ExecutionException, SocketException
{
ServerConfig config = new ServerConfig();
// 服务端监听的端口
config.setPort(80);
config.setInitListeners(new myInitListener());
// 设置包解码器。包解码器用来从tcp的数据流中截取出一个完整的tcp报文
// 这个解码器是行解码器。使用换行符进行报文切割
// 当然,开发者也可以根据自己的业务需求,自行定制包解码器。框架本身提供了4种最为常见的包解码器。
config.setFrameDecodec(new LineBasedFrameDecodec(1000));
// 使用上面的配置新建一个服务端对象
AioServer aioServer = new AioServer(config);
// 启动服务端
aioServer.start();
AioClient aioClient = new FutureClient();
aioClient.setAddress("127.0.0.1").setPort(80);
aioClient.setFrameDecodec(new LineBasedFrameDecodec(100));
aioClient.setWriteHandlers(new DataHandler() {
@Override
public Object handle(Object data, InternalResult result) throws SocketException
{
String value = (String) data;
ByteBuf<?> buf = DirectByteBufPool.getInstance().get(100);
buf.writeString(value, Charset.forName("utf8"));
buf.writeByte((byte) '\r');
buf.writeByte((byte) '\n');
return buf;
}
});
aioClient.setReadHandlers(new DataHandler() {
@Override
public Object handle(Object data, InternalResult result) throws SocketException
{
ByteBuf<?> buf = (ByteBuf<?>) data;
String value = buf.readString(Charset.forName("utf8"));
buf.release();
return value;
}
});
// 使用对应的参数链接服务端
aioClient.connect();
//返回一个future实现。在收到消息后
Future<?> future = aioClient.write("你好,这里是客户端");
System.out.println(future.get());
// 服务端关闭
aioServer.stop();
}
}
通过阅读上面的例子,相信开发者对于如何编写基于Jnet的socket程序已经有了初步的感官认识。通过上面的例子,也可以看到,基于Jnet开发,是非常简单和方便的。 对于服务端,开发者只需要关注
对于客户端,开发者只需要关注
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。