java socket与Netty服务器通信

原创 2016年08月28日 16:05:42

java socket与Netty服务器通信

本人初学java,第一次学写技术博客:


ByteBuffer与ByteBuf

C/C++中在进行网络通信的过程中直接面对的是字节流或是字符流。java中网络通信的话面对的是缓冲区buffer。
ByteBuffer是来自于java.nio
ByteBuf是来自于io.netty.buffer 两者相互转换自然是可以的。ByteBuf的nioBuffer()方法可以得到ByteBuf对应的ByteBuffer.

使用ByteBuffer与Netty通信

在ByteBuffer 开始写入需要传输数据的大小

应用的背景是通过Socket 将一个自定义类传输到服务器,在服务器正确解析出这个类。
在传输的ByteBuffer的开始四字节存储要传输byte数组的长度,再将要传输的byte数组放入ByteBuffer中。
在接收端的相应的要在pipeline中加入两个处理函数
LengthFieldBasedFrameDecoder()              LengthFieldPrepender()

客户端

        if(socket == null)
            socket = new Socket(host, port);
        OutputStream out = socket.getOutputStream();
        ByteBuffer header = ByteBuffer.allocate(4);
        header.putInt(socksend.length);
        out.write(header.array());
        out.write(socksend);
        out.flush();

服务器

ch.pipeline().addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));
ch.pipeline().addLast("frameEncoder", new LengthFieldPrepender(4));
ch.pipeline().addLast(new CsDecoder());
ch.pipeline().addLast(new CBgHandler());

socksend是自定义类转换成的byte数组,
CsDecoder()是在服务器端将收到的数据转换成自定义类

ByteBuffer 写入数据后调用flip()函数

写看代码

        if(socket == null)
            socket = new Socket(host, port);
        OutputStream out = socket.getOutputStream();
        ByteBuffer header = ByteBuffer.allocate(1024);
        header.clear();
        header.put(socksend);
        header.flip();
        out.write(header.array());
        out.flush();
 ch.pipeline().addLast(new CsDecoder());
 ch.pipeline().addLast(new CBgHandler());

直接讲数据写入ByteBuffer并且不调用flip()方法的话,服务器接收到数据总是无法解析。
因为ByteBuffer中有一个position和limit,在写入数据的过程中position不断增加,limit是ByteBuffer的最大容量。在读取ByteBuffer时是从position到limit的数据。所以flip()函数的作用就是在数据写完后将position置为0,limit置为写入字节的数量,这样ByteBuffer才能正确的du’ru。

使用ByteBuf与Netty通信

因为ByteBuf是Netty内部实现的类,所以可以和Netty无缝衔接实现起来自然方便很多。
客户端

        if(socket == null)
            socket = new Socket(host, port);
        OutputStream out = socket.getOutputStream();
        ByteBuf header = Unpooled.buffer(1024);
        header.writeBytes(pbdata);
        out.write(header.array());
        out.flush();

服务器

 ch.pipeline().addLast(new CsDecoder());
 ch.pipeline().addLast(new CBgHandler());
版权声明:本文为博主原创文章,未经博主允许不得转载。

Socket通讯-Netty框架实现Java通讯(字符串信息的传输)

Netty简介Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是...

Netty与java Socket通信不太好使

之前我使用的是netty-all-4.0.15.Final-sources.jar 因为之前从网上下载了一个推送的例子,跑起来可以成功。但是我想不能所有的客户端都去用你netty的Bootstr...
  • lwb314
  • lwb314
  • 2015年07月17日 10:45
  • 2620

Netty高性能大容量Socket并发(一):Netty性能测试

从测试结果看,Netty性能是非常高的,在所有使用默认配置的情况下,单台服务器能够达到4万次请求解析,作为RPC框架是足够用的。还有一个有趣的现象是每次都创建连接和重用连接的差别不大,性能损耗对应用层...

一起学Netty(十四)之 Netty生产级的心跳和重连机制

sigh,这这篇博客的时候老脸还是红了一下,应该算是剽窃吧,看到别人写的代码有点无地之容,好在文章的标题是“一起学”,而不是开涛大神的“跟我学”系列的文章 最近工作比较忙,但闲暇之余还是看了阿里的...
  • linuu
  • linuu
  • 2016年05月27日 09:46
  • 18880

一起学Netty(十三)之 Netty简单的重连机制

其实重连机制并不是多么多高深的技术,其实就是一个在客户端做一个简单的判断,如果连接断了,那么就重新调用连接服务端的代码 当然,我们重连的动作肯定是发生在断连之后发生的,我们可以在上篇的心跳机制的基...
  • linuu
  • linuu
  • 2016年05月14日 10:15
  • 3381

java netty socket库和自定义C#socket库利用protobuf进行通信完整实例

之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket、和java netty 库的二次封装,但是没有真正的发表测试用例。 本文只是为了讲解利用protobuf 进行...

一个 Java 的 Socket 服务器和客户端通信的例子

一个 HelloWord 级别的 Java Socket 通信的例子。通讯过程:         先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求。然后运行 Client 端...
  • defonds
  • defonds
  • 2012年09月12日 15:21
  • 131176
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java socket与Netty服务器通信
举报原因:
原因补充:

(最多只允许输入30个字)