您好,我想问一下怎么设置MINA的协议,比如把UDP改成TCP

解决方案 »

  1.   

    您好,我想问一下怎么设置MINA的协议,比如把UDP改成TCP
      

  2.   

    不好意思最近很少上csdn了。太忙了 。mina支持很多协议,tcp和udp都支持。当需要通过socket和mina进行通讯的时候不能用mina自带的过滤器进行转码,因为mina的过滤器必须成对出现。如果你在server/client端用了mina的过滤器。那么在client/server端必须也得用过滤器。我用mina做的那个项目已经完工了。感觉mina不是很好。性能问题跟不上。其中最不好的地方就是在客户端在创佳连接的时候SocketConnector connector = new NioSocketConnector();无法将connector对象释放。如果你做过压力测试的话,你会发现如果connector对象不释放对程序的性能影响是很大的。我到目前为止还没找到适合的方法去完善它。用了个下下策就是只用mina开发服务器,客户端就用socket做。哈哈哈。实在是没办法。 
      

  3.   

    小弟,正在用mina 正在苦恼中,项目也是手机和mina通信,手机端的   DataInputStream , DataOutputStream,传数据到服务器中,messageReceived接受不到,不知你是如何解决的,能否给发个代码片段,或指点一下,也可以!谢谢了!
      

  4.   

    这些方法可以帮助你在不使用mina filter的情况下进行转码!如果你手机上直接用socket的话,mina server就不能用filter。所以说下面的方法对你来说很有用的。你可以把你的代码弄出来大家看看。那样会更好的帮你找出问题的所在
    /**
     * 将byte[]转换成string 
     * @param butBuffer
     */
    public static String byteToString(byte [] b)
    {
    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < b.length; i++)
    {
    stringBuffer.append((char) b [i]);
    }
    return stringBuffer.toString();
    } /**
     * 将bytebuffer转换成string 
     * @param str
     */
    public static IoBuffer stringToIoBuffer(String str)
    { byte bt[] = str.getBytes(); IoBuffer ioBuffer = IoBuffer.allocate(bt.length);
    ioBuffer.put(bt, 0, bt.length);
    ioBuffer.flip();
    return ioBuffer;
    }
    /**
     * 将IoBuffer转换成string 
     * @param str
     */
    public static IoBuffer byteToIoBuffer(byte [] bt,int length)
    { IoBuffer ioBuffer = IoBuffer.allocate(length);
    ioBuffer.put(bt, 0, length);
    ioBuffer.flip();
    return ioBuffer;
    }
    /**
     * 将IoBuffer转换成byte 
     * @param str
     */
    public static byte [] ioBufferToByte(Object message)
    {
    if (!(message instanceof IoBuffer))
    {
    return null;
    }
    IoBuffer ioBuffer = (IoBuffer)message;
    byte[] b = new byte[ioBuffer.limit()];
    ioBuffer.get(b);
    return b;
    }
    /**
     * 将IoBuffer转换成string 
     * @param butBuffer
     */
    public static String ioBufferToString(Object message)
    {
    if (!(message instanceof IoBuffer))
    {
    return "";
    }
    IoBuffer ioBuffer = (IoBuffer) message;
    byte[] b = new byte [ioBuffer.limit()];
    ioBuffer.get(b);
    StringBuffer stringBuffer = new StringBuffer();

    for (int i = 0; i < b.length; i++)
    { stringBuffer.append((char) b [i]);
    }
    return stringBuffer.toString();
    }
      

  5.   

    手机端:
            try {
                socket = (SocketConnection) Connector.open("socket://127.0.0.1:9123");
                dis = socket.openDataInputStream();
                dos = socket.openDataOutputStream();
                String str = "111111";
                dos.writeUTF(str);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
    将字符串:111111发给服务器端
    服务器端:如何得到数据呢?
           acceptor = new NioSocketAcceptor();
            acceptor.getFilterChain().addLast("logger", new LoggingFilter());
            //创建接收数据的过滤器
            DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
            //设定这个过滤器将一行一行(/r/n)的读取数据
            chain.addLast("myChin",new ProtocolCodecFilter(new TextLineCodecFactory()));
            chain.addLast("ddd", new StreamWriteFilter());
            acceptor.setHandler(new TimeServerHandler(this));//指定业务逻辑处理器
            acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));//设置端口号
            try {
                //设置端口号
                acceptor.bind(); //启动监听
            } catch (IOException ex) {     }如果设置:chain.addLast("myChin",new ProtocolCodecFilter(new TextLineCodecFactory())); TimeServerHandler根本就执行不到:messageReceived,
    如果设置:        chain.addLast("ddd", new StreamWriteFilter()); TimeServerHandler的messageReceived能得到数据:message.toString() = "HeapBuffer[pos=0 lim=8 cap=2048: 00 06 31 31 31 31 31 31]"是不是要自己写个filter呀!如何写!我总不能简单的从上面得到的字符串中,取几位再转换吧!谢谢userdaye,你的转换代码应该用的上,各位是如何解决的,手机端用什么发的数据!
      

  6.   

    如果按照userdaye的方法,肯定能实现解码,得到的字符串很有规律呀!”00 06 31 31 31 31 31 31“ 00 06 是长度,后面是内容,再用userdaye的方法,就解决了,但是如果手机所发字符串:“111111222222高3”,返回的串就是"HeapBuffer[pos=0 lim=18 cap=2048: 00 10 31 31 31 31 31 31 32 32 32 32 32 32 E9 AB...]"没有了高后面的3,还存在中文问题!是否有更好的方法?
      

  7.   

    userdaye 手机socket是否也是openDataOutputStream?还是用其他的!
      

  8.   

    解码问题我没碰到,因为我做的那个系统没的中文。全部是数字和字母,还有个原因就是那个程序要在linux系统下面运行,所以基本没的中文。你自己解决一下吧,filter可以自己写一个,网上有这方面的例子。手机开发我没弄过不好意!!
      

  9.   

    客户端socket怎么写才能连接到mina服务器的,服务器应该怎么修改呢?
      

  10.   


    把手机端和mina端的代码贴出来晒下。我们也学习学习!