我在服务器端使用Apache Mina . 我是一个用传统IO编写的客户端 . 这是将数据发送到服务器的CLIENT端代码 .
class SomeClass extends Thread
{
Socket socket;
//Constructor
SomeClass()
{
Socket socket = ...
}
public void run()
{
while (j++ & lt; 10)
{
System.out.println("CLIENT[" + clientNo + "] Send Message =>" + requests[clientNo][j]);
OutputStream oStrm = socket.getOutputStream();
byte[] byteSendBuffer = (requests[clientNo][j]).getBytes();
oStrm.write(byteSendBuffer);
oStrm.flush();
}
}
}
上面的线程运行20次 . 因此创建了20个套接字 . 在1个套接字中,发送了许多消息 . 使用IO套接字类编写的服务器,我能够完美地检索数据 .
问题出现在使用BUFFER的基于Apache Mina的服务器上!我无法获得个人信息 .
我如何获得单独的消息(因为我无法在客户端更改任何内容,并且不知道单个消息的长度)
Server Side Code
套接字创建
public static void main(String[] args) throws IOException, SQLException {
System.out.println(Charset.defaultCharset().name());
IoAcceptor acceptor = new NioSocketAcceptor();
ProtocolCodecFilter(charset.newEncoder(),charset.newDecoder() ));
acceptor.setHandler( new TimeServerHandler() );
acceptor.getSessionConfig().setReadBufferSize(64 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
acceptor.bind( new InetSocketAddress(PORT) );
}
处理程序代码
public void messageReceived(IoSession session, Object message) throws Exception {
AbstractIoBuffer bf = (AbstractIoBuffer)message;
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();
String outString = bf.getString(decoder);
}
2 回答
MINA实际上是一个非常精细的框架,以优雅的方式解决您的问题 . 它的基本概念是过滤器链,其中一系列过滤器应用于传入消息 .
您应该实现协议解码器(实现
MessageDecoder
)并将其注册到MINA过滤器链中 . 该解码器应该将字节缓冲区解析为您选择的对象表示 .然后,您可以注册处理完整消息的消息处理程序 .
你没有 . 在TCP中没有消息这样的东西 . 它是一个字节流协议 . 没有消息边界,并且不能保证一个读取等于另一端的一个写入 .
您将不得不根据应用程序协议的定义解析消息以找到它们停止的位置 . 如果这是不可能的,因为,例如,协议是模糊的,客户端将不得不被废弃 . 然而,似乎你不能改变客户端,它必须已经与现有系统一起工作,所以在你遇到同样的问题并以某种方式解决它之前 .