protocol buf结合mina开发网络程序
2011-11-16 17:15
309 查看
一、服务端代码
二、客户端代码
三、Handler的消息接收处理
不能直接write字节数组,必须使用IoBuffer对象(因为是字节流),flip方式是必须调用的,否则客户端无法获得数据。
public static void main(String[] args) throws NamingException, BeanException { System.setProperty("java.naming.factory.initial", "org.apache.naming.java.javaURLContextFactory"); // 加载machine InitialContext 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 block e.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 block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
三、Handler的消息接收处理
@Override public 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方式是必须调用的,否则客户端无法获得数据。
相关文章推荐
- Visual C#.Net网络程序开发-Tcp篇(1)
- 基于MINA框架快速开发网络应用程序(转)
- NetworkComms网络程序开发笔记(一): 在多线程环境中安全的触发事件
- 结合JavaScript与ASP.NETWeb窗体进行程序开发
- java服务器开发:基于mina的网络通信模块
- Visual C#.Net 网络程序开发Socket篇
- 开发适应中国网络的J2ME连网程序(转)
- 异步非阻塞套接字Winsock开发网络通信程序的经典入门
- Visual C#.Net网络程序开发-Tcp篇
- Android开发网络程序-Tomcat配置
- 基于MINA框架快速开发网络应用程序
- Mina网络应用框架及TCP/UDP开发范例(编著)
- 使用PHP程序开发高效的WEB网络系统
- 网络蜘蛛程序开发
- Winsock开发网络通信程序的经典入门
- 结合JavaScript与ASP.NET Web窗体进行程序开发
- Linux 一句话问答(血的教训+网络无关篇+网络相关篇+程序开发篇+经典图书)
- 异步非阻塞套接字Winsock开发网络通信程序的经典入门
- Winsock开发网络通信程序的经典入门——解释异步等概念