protocol buf结合mina开发网络程序

来源:互联网 发布:制作linux u盘启动盘 编辑:程序博客网 时间:2024/05/17 07:51

一、服务端代码

public static void main(String[] args) throws NamingException, BeanException {System.setProperty("java.naming.factory.initial","org.apache.naming.java.javaURLContextFactory");// 加载machineInitialContext context = new InitialContext();File configDir = new File(getConfigDirectory(),SERVICE_CONFIGURATION_FILE);initService(configDir, context);// 启动socket服务NioSocketAcceptor acceptor = new NioSocketAcceptor();acceptor.getFilterChain().addLast("logger", new LoggingFilter());acceptor.getFilterChain().addLast("codec", new StreamWriteFilter()); acceptor.setHandler(new ServiceRouteServerHandler());acceptor.getSessionConfig().setReadBufferSize(4096);acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);try {acceptor.bind(new InetSocketAddress(PORT));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
注意红色部分,因为protocol buf良好的支持字节流,所有要使用此过滤器

二、客户端代码

public static void main(String[] args) {Socket client;try {client = new Socket("127.0.0.1", 9123);OutputStream out = client.getOutputStream();RequestBeanProtos.RequestBean request = RequestBeanProtos.RequestBean.newBuilder().setAccount("811").setDeviceId("device1").setGroup("sync").setType("card").build();out.write(request.toByteArray());InputStream in = client.getInputStream();byte[] data = IOTools.readContent(in, 4096);System.out.println(new String(data));if (data != null && data.length > 0) {ServiceResponseBeanProtos.ResponseBean response = ServiceResponseBeanProtos.ResponseBean.parseFrom(data);System.out.println(response.getError());System.out.println(response.getContent());} else {System.out.println("content is empty!");}out.close();in.close();client.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

三、Handler的消息接收处理

@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {IoBuffer buffer = (IoBuffer) message;ByteBuffer bf = buffer.buf();byte[] tempBuffer = new byte[bf.limit()];bf.get(tempBuffer);RouteEngine engine = Configuration.getConfiguration().getEngine();byte []data = engine.response(tempBuffer);int len = data.length;IoBuffer resp = IoBuffer.allocate(len);resp.put(data, 0, len);resp.flip();  session.write(resp);}


不能直接write字节数组,必须使用IoBuffer对象(因为是字节流),flip方式是必须调用的,否则客户端无法获得数据。


原创粉丝点击