Grizzly NIO框架 理论篇 【4】

本文介绍了端口统一技术,特别是PortunificationFilter如何判断不同协议并转发至相应处理流程。通过一个具体示例展示了如何实现协议识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Port Unification Overview(端口统一)

针对在一个端口上开放多种协议的服务,类似下图:
""
通过Port unification Filter去判断三种协议,然后针对不同协议传递到下一个Filter执行后续工作。
其中Finder的Grizzly官方给了一个简单用例,针对协议包头是"add"的Finder
  1. /**
  2. * {@link ProtocolFinder}, responsible to determine if incoming byte buffer
  3. * represents ADD-service request.
  4. */
  5. publicclassAddProtocolFinderimplementsProtocolFinder{
  6. privatefinalstaticbyte[] magic ={'a','d','d'};
  7. /**
  8. * {@inheritDoc}
  9. */
  10. @Override
  11. publicResult find(finalPUContext puContext,finalFilterChainContext ctx){
  12. // Get the input Buffer
  13. finalBuffer inputBuffer = ctx.getMessage();
  14. finalint bytesToCompare =Math.min(magic.length, inputBuffer.remaining());
  15. finalint bufferStart = inputBuffer.position();
  16. // Compare incoming bytes with ADD-service protocol magic
  17. for(int i =0; i < bytesToCompare; i++){
  18. if(magic[i]!= inputBuffer.get(bufferStart + i)){
  19. // If at least one byte doesn't match - it's not ADD-service protocol
  20. returnResult.NOT_FOUND;
  21. }
  22. }
  23. // if we check entire magic - return FOUND, or NEED_MORE_DATA otherwise
  24. return bytesToCompare == magic.length ?
  25. Result.FOUND :Result.NEED_MORE_DATA;
  26. }
  27. }
这个简单例子应该明白怎么判断了吧,然后就是转到对应的协议
 
-------------------------------
理论学习暂且到此为止,水平实在有限,本人仅使用了基础功能,所以大部分扩展都没有去学习,希望有高人可以补充


 
import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.Image; import javax.microedition.lcdui.ImageItem; import javax.microedition.lcdui.Item; import javax.microedition.lcdui.TextField; public class PhoneAdd extends Form { private UIController controller; private Command BACK_COMMAND; private Command SAVE_COMMAND; private TextField nameField; private TextField phoneField; private TextField QQField; private TextField sexField; private TextField ageField; // private ImageItem iconQQ; // private Image icon; public PhoneAdd(String title, UIController control) { super(title); controller = control; this.setCommandListener(new PhoneAddListener()); BACK_COMMAND = new Command("返回", Command.BACK, 1); SAVE_COMMAND = new Command("确认", Command.OK, 2); this.addCommand(BACK_COMMAND); this.addCommand(SAVE_COMMAND); /* try{ icon=Image.createImage("/icon/7.png"); }catch(java.io.IOException e){ icon=null; System.out.println("图片导入异常"); } */ nameField = new TextField("名字", "", 16, TextField.ANY); phoneField = new TextField("电话", "", 16, TextField.PHONENUMBER); QQField = new TextField("QQ", "", 11, TextField.NUMERIC); sexField = new TextField("性别", "", 2, TextField.ANY); ageField = new TextField("年龄","",3,TextField.NUMERIC); // iconQQ=new ImageItem("",icon,Item.LAYOUT_LEFT,"图片无法显示"); this.append(nameField); this.append(phoneField); this.append(sexField); // this.append(iconQQ); this.append(QQField); this.append(ageField); } public void clear() { nameField.setString(""); phoneField.setString(""); sexField.setString(""); QQField.setString(""); ageField.setString(""); } private class PhoneAddListener implements CommandListener { public void commandAction(Command command, Displayable disp) { if (command == BACK_COMMAND) { controller.handleEvent(UIController.EventID.EVENT_VIEW_BACK, null); } else if (command == SAVE_COMMAND) { String name = nameField.getString(); String phone = phoneField.getString(); String QQ = QQField.getString(); String sex = sexField.getString(); String age= ageField.getString(); if ((name == null || name.equals("")) || (phone == null || phone.equals(""))) { return; } Object[] args = { name, phone, QQ, sex ,age}; controller.handleEvent(UIController.EventID.EVENT_NEW_SAVE, args); } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值