欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么用MINA、Netty、Twisted來實現(xiàn)消息分割

這篇文章主要介紹了怎么用MINA、Netty、Twisted來實現(xiàn)消息分割,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)長期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為白云企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計,白云網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

本文介紹一種消息分割方式,use a fixed length header that indicates the length of the body,用一個固定字節(jié)數(shù)的Header前綴來指定Body的字節(jié)數(shù),以此來分割消息。

怎么用MINA、Netty、Twisted來實現(xiàn)消息分割  固定字節(jié)數(shù)的Header前綴來指定Body的字節(jié)數(shù)

上面圖中 Header 固定為 4 字節(jié),Header 中保存的是一個 4 字節(jié)(32位)的整數(shù),例如 12 即為 0x0000000C,這個整數(shù)用來指定 Body 的長度(字節(jié)數(shù))。當(dāng)讀完這么多字節(jié)的 Body 之后,又是下一條消息的 Header。

下面分別用MINA、Netty、Twisted來實現(xiàn)對這種消息的切合和解碼。

MINA

MINA 提供了 PrefixedStringCodecFactory 來對這種類型的消息進行編碼解碼,PrefixedStringCodecFactory 默認 Header 的大小是4字節(jié),當(dāng)然也可以指定成1或2。

public class TcpServer {

 public static void main(String[] args) throws IOException {
   IoAcceptor acceptor = new NioSocketAcceptor();

   // 4字節(jié)的Header指定Body的字節(jié)數(shù),對這種消息的處理
   acceptor.getFilterChain().addLast("codec",
       new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset.forName("UTF-8"))));

   acceptor.setHandler(new TcpServerHandle());
   acceptor.bind(new InetSocketAddress(8080));
 }

}

class TcpServerHandle extends IoHandlerAdapter {

 @Override
 public void exceptionCaught(IoSession session, Throwable cause)
     throws Exception {
   cause.printStackTrace();
 }

 // 接收到新的數(shù)據(jù)
 @Override
 public void messageReceived(IoSession session, Object message)
     throws Exception {

   String msg = (String) message;
   System.out.println("messageReceived:" + msg);

 }

 @Override
 public void sessionCreated(IoSession session) throws Exception {
   System.out.println("sessionCreated");
 }

 @Override
 public void sessionClosed(IoSession session) throws Exception {
   System.out.println("sessionClosed");
 }
}

Netty

Netty 使用 LengthFieldBasedFrameDecoder 來處理這種消息。下面代碼中的new LengthFieldBasedFrameDecoder(80, 0, 4, 0, 4)中包含5個參數(shù),分別是int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip。maxFrameLength為消息的最大長度,lengthFieldOffset為Header的位置,lengthFieldLength為Header的長度,lengthAdjustment為長度調(diào)整(默認Header中的值表示Body的長度,并不包含Header自己),initialBytesToStrip為去掉字節(jié)數(shù)(默認解碼后返回Header+Body的全部內(nèi)容,這里設(shè)為4表示去掉4字節(jié)的Header,只留下Body)。

public class TcpServer {

 public static void main(String[] args) throws InterruptedException {
   EventLoopGroup bossGroup = new NioEventLoopGroup();
   EventLoopGroup workerGroup = new NioEventLoopGroup();
   try {
     ServerBootstrap b = new ServerBootstrap();
     b.group(bossGroup, workerGroup)
         .channel(NioServerSocketChannel.class)
         .childHandler(new ChannelInitializer<SocketChannel>() {
           @Override
           public void initChannel(SocketChannel ch)
               throws Exception {
             ChannelPipeline pipeline = ch.pipeline();

             // LengthFieldBasedFrameDecoder按行分割消息,取出body
             pipeline.addLast(new LengthFieldBasedFrameDecoder(80, 0, 4, 0, 4));
             // 再按UTF-8編碼轉(zhuǎn)成字符串
             pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));

             pipeline.addLast(new TcpServerHandler());
           }
         });
     ChannelFuture f = b.bind(8080).sync();
     f.channel().closeFuture().sync();
   } finally {
     workerGroup.shutdownGracefully();
     bossGroup.shutdownGracefully();
   }
 }

}

class TcpServerHandler extends ChannelInboundHandlerAdapter {

 // 接收到新的數(shù)據(jù)
 @Override
 public void channelRead(ChannelHandlerContext ctx, Object msg) {

   String message = (String) msg;
   System.out.println("channelRead:" + message);
 }

 @Override
 public void channelActive(ChannelHandlerContext ctx) {
   System.out.println("channelActive");
 }

 @Override
 public void channelInactive(ChannelHandlerContext ctx) {
   System.out.println("channelInactive");
 }

 @Override
 public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
   cause.printStackTrace();
   ctx.close();
 }
}

Twisted

在Twisted中需要繼承Int32StringReceiver,不再繼承Protocol。Int32StringReceiver表示固定32位(4字節(jié))的Header,另外還有Int16StringReceiver、Int8StringReceiver等。而需要實現(xiàn)的接受數(shù)據(jù)事件的方法不再是dataReceived,也不是lineReceived,而是stringReceived。

# -*- coding:utf-8 –*-

from twisted.protocols.basic import Int32StringReceiver
from twisted.internet.protocol import Factory
from twisted.internet import reactor

class TcpServerHandle(Int32StringReceiver):

   # 新的連接建立
   def connectionMade(self):
       print 'connectionMade'

   # 連接斷開
   def connectionLost(self, reason):
       print 'connectionLost'

   # 接收到新的數(shù)據(jù)
   def stringReceived(self, data):
       print 'stringReceived:' + data

factory = Factory()
factory.protocol = TcpServerHandle
reactor.listenTCP(8080, factory)
reactor.run()

下面是Java編寫的一個客戶端測試程序:

public class TcpClient {

 public static void main(String[] args) throws IOException {

   Socket socket = null;
   DataOutputStream out = null;

   try {

     socket = new Socket("localhost", 8080);
     out = new DataOutputStream(socket.getOutputStream());

     // 請求服務(wù)器
     String data1 = "牛頓";
     byte[] outputBytes1 = data1.getBytes("UTF-8");
     out.writeInt(outputBytes1.length); // write header
     out.write(outputBytes1); // write body

     String data2 = "愛因斯坦";
     byte[] outputBytes2 = data2.getBytes("UTF-8");
     out.writeInt(outputBytes2.length); // write header
     out.write(outputBytes2); // write body

     out.flush();

   } finally {
     // 關(guān)閉連接
     out.close();
     socket.close();
   }

 }

}

MINA服務(wù)器輸出結(jié)果:

sessionCreated

messageReceived:牛頓

messageReceived:愛因斯坦

sessionClosed

Netty服務(wù)器輸出結(jié)果:

channelActive

channelRead:牛頓

channelRead:愛因斯坦

channelInactive

Twisted服務(wù)器輸出結(jié)果:

connectionMade

stringReceived:牛頓

stringReceived:愛因斯坦

connectionLost

感謝你能夠認真閱讀完這篇文章,希望小編分享的“怎么用MINA、Netty、Twisted來實現(xiàn)消息分割”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

當(dāng)前文章:怎么用MINA、Netty、Twisted來實現(xiàn)消息分割
文章鏈接:http://chinadenli.net/article24/ppcgce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、全網(wǎng)營銷推廣、小程序開發(fā)、電子商務(wù)、網(wǎng)站導(dǎo)航、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
久久精视频免费视频观看| 五月综合激情婷婷丁香| 国产熟女一区二区三区四区| 日韩视频在线观看成人| 国产级别精品一区二区视频| 91人妻人人做人碰人人九色| 国产精品欧美一区二区三区| 日本高清不卡一二三区| 中文字幕区自拍偷拍区| 久久精品亚洲情色欧美| 99秋霞在线观看视频| 精品人妻av区波多野结依| 在线一区二区免费的视频| 国产精品久久女同磨豆腐| 高跟丝袜av在线一区二区三区| 欧美又黑又粗大又硬又爽| 丰满少妇被猛烈插入在线观看| 日本亚洲精品在线观看| 日韩欧美二区中文字幕| 国产一级内射麻豆91| 国产高清三级视频在线观看| 亚洲综合精品天堂夜夜| 国内欲色一区二区三区| 国产欧美日本在线播放| 国产免费成人激情视频| 四季av一区二区播放| 黑鬼糟蹋少妇资源在线观看| 日韩国产亚洲一区二区三区| 亚洲精品深夜福利视频| 亚洲国产成人精品一区刚刚| 国产亚洲欧美另类久久久| 成人精品日韩专区在线观看| 亚洲在线观看福利视频| 国产免费无遮挡精品视频| 久久精品欧美一区二区三不卡| 欧美精品亚洲精品日韩精品| 日韩成人h视频在线观看| 亚洲一区二区精品免费| 日本深夜福利在线播放| 亚洲妇女黄色三级视频| 欧美黄色黑人一区二区|