您的位置:首页 > 理论基础 > 计算机网络

protocol buf结合mina开发网络程序

2011-11-16 17:15 309 查看
一、服务端代码

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方式是必须调用的,否则客户端无法获得数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: