You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by 李健 <ji...@jit.com.cn> on 2007/05/15 11:04:38 UTC

How can i deal with the old [DataInputStream & DataOutputStream] client

Hi, All
    
    i wanna to use MINA to improve my ApplicationServer, the old application's socket part is developed using DataInputStream & DataOutputStream in both server and client side. we wrote data package length at the begining for ervry request and response data. the code looks like this

    // for request
    byte [] request = ...
    int reqLen = request.length;
    dataOutputStream.writeInt(reqLen);
    dataOutputStream.write(request);
    dataOutputStream.flush();
    ...
    // for response
    int resLen = dataInputStream.readInt();
    byte[] response = new byte[resLen];
    dataInputStream.read(response);
    ...
    

    i'v tried to use MINA to handle the request sent by my old clients(the clients have been deployed in many area and CodeChanging is forbidden), because of the noblocking of NIO, when one client calls writeInt(), write(), flush() methods orderly, my IoHandler would recevie data partly in many times. so in  IoHandler.messageRecevied(), it couldn't get the whole request data to do the business logic.
      
    who can give me some advice to handle tihs?

Best Regard!
                      LJ

                2007-05-15
              

Re: How can i deal with the old [DataInputStream & DataOutputStream] client

Posted by mat <fo...@gmail.com>.
I think you have to write your own decoder class to reassemly the whole
message. The good starting point is to take a look at sumup example. It
really helps.

2007/5/15, 李健 <ji...@jit.com.cn>:
>
> Hi, All
>
>    i wanna to use MINA to improve my ApplicationServer, the old
> application's socket part is developed using DataInputStream &
> DataOutputStream in both server and client side. we wrote data package
> length at the begining for ervry request and response data. the code looks
> like this
>
>    // for request
>    byte [] request = ...
>    int reqLen = request.length;
>    dataOutputStream.writeInt(reqLen);
>    dataOutputStream.write(request);
>    dataOutputStream.flush();
>    ...
>    // for response
>    int resLen = dataInputStream.readInt();
>    byte[] response = new byte[resLen];
>    dataInputStream.read(response);
>    ...
>
>
>    i'v tried to use MINA to handle the request sent by my old clients(the
> clients have been deployed in many area and CodeChanging is forbidden),
> because of the noblocking of NIO, when one client calls writeInt(), write(),
> flush() methods orderly, my IoHandler would recevie data partly in many
> times. so in  IoHandler.messageRecevied(), it couldn't get the whole
> request data to do the business logic.
>
>    who can give me some advice to handle tihs?
>
> Best Regard!
>                      LJ
>
>     2007-05-15
>
>

Re: How can i deal with the old [DataInputStream & DataOutputStream] client

Posted by mat <fo...@gmail.com>.
You have to reassembly the complete message by using decoder. Please read
the SumUp example first.

2007/5/17, 李健 <ji...@jit.com.cn>:
>
>    i'v tested to send request like "123" using DataOutputStream
>
>    byte[] req = "123".getBytes()
>    dataOutputStream.writeInt(req.length);
>    dataOutputStream.write(req);
>    dataOutputStream.flush();
>
>    i tried to send this request 10 times, the server received data like
> this:
>
>    recevieLen=7 [ 0 0 0 3 49 50 51 ]
>    recevieLen=7 [ 0 0 0 3 49 50 51 ]
>    recevieLen=7 [ 0 0 0 3 49 50 51 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 3 ]
>    recevieLen=3 [ 49 50 51 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 3 ]
>    recevieLen=3 [ 49 50 51 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 3 ]
>    recevieLen=3 [ 49 50 51 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 0 ]
>    recevieLen=1 [ 3 ]
>    recevie=3 [ 49 50 51 ]
>    ......
>
>
>    i'v looked into JDK source code about DataOutputStream:
>    public final void writeInt(int v) throws IOException {
>        out.write((v >>> 24) & 0xFF);
>        out.write((v >>> 16) & 0xFF);
>        out.write((v >>>  8) & 0xFF);
>        out.write((v >>>  0) & 0xFF);
>        incCount(4);
>    }
>    it will cal out.write() for every byte, so my server'll recevie length
> value 4 times.
>
>    why the first 2 or 3 times request will be OK (the server can get the
> whole 7 bytes), who can gvie me some help to handle this problem, thanks a
> lot.
>
> ======== 2007-05-15 17:08:29: ========
>
> Hi, All
>
>    i wanna to use MINA to improve my ApplicationServer, the old
> application's socket part is developed using DataInputStream &
> DataOutputStream in both server and client side. we wrote data package
> length at the begining for ervry request and response data. the code looks
> like this
>
>    // for request
>    byte [] request = ...
>    int reqLen = request.length;
>    dataOutputStream.writeInt(reqLen);
>    dataOutputStream.write(request);
>    dataOutputStream.flush();
>    ...
>    // for response
>    int resLen = dataInputStream.readInt();
>    byte[] response = new byte[resLen];
>    dataInputStream.read(response);
>    ...
>
>
>    i'v tried to use MINA to handle the request sent by my old clients(the
> clients have been deployed in many area and CodeChanging is forbidden),
> because of the noblocking of NIO, when one client calls writeInt(), write(),
> flush() methods orderly, my IoHandler would recevie data partly in many
> times. so in  IoHandler.messageRecevied(), it couldn't get the whole
> request data to do the business logic.
>
>    who can give me some advice to handle tihs?
>
> Best Regard!
>                      LJ
>
>     2007-05-15
>
>
> = = = = = = = = = = = = = = = = = = = = = =
>

Re: How can i deal with the old [DataInputStream & DataOutputStream] client

Posted by 李健 <ji...@jit.com.cn>.
    i'v tested to send request like "123" using DataOutputStream
    
    byte[] req = "123".getBytes()
    dataOutputStream.writeInt(req.length);
    dataOutputStream.write(req);
    dataOutputStream.flush();

    i tried to send this request 10 times, the server received data like this:

    recevieLen=7 [ 0 0 0 3 49 50 51 ]
    recevieLen=7 [ 0 0 0 3 49 50 51 ]
    recevieLen=7 [ 0 0 0 3 49 50 51 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 3 ]
    recevieLen=3 [ 49 50 51 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 3 ]
    recevieLen=3 [ 49 50 51 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 3 ]
    recevieLen=3 [ 49 50 51 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 0 ]
    recevieLen=1 [ 3 ]
    recevie=3 [ 49 50 51 ]
    ......  

    
    i'v looked into JDK source code about DataOutputStream:    
    public final void writeInt(int v) throws IOException {
        out.write((v >>> 24) & 0xFF);
        out.write((v >>> 16) & 0xFF);
        out.write((v >>>  8) & 0xFF);
        out.write((v >>>  0) & 0xFF);
        incCount(4);
    }
    it will cal out.write() for every byte, so my server'll recevie length value 4 times. 

    why the first 2 or 3 times request will be OK (the server can get the whole 7 bytes), who can gvie me some help to handle this problem, thanks a lot.

======== 2007-05-15 17:08:29: ========

Hi, All
    
    i wanna to use MINA to improve my ApplicationServer, the old application's socket part is developed using DataInputStream & DataOutputStream in both server and client side. we wrote data package length at the begining for ervry request and response data. the code looks like this

    // for request
    byte [] request = ...
    int reqLen = request.length;
    dataOutputStream.writeInt(reqLen);
    dataOutputStream.write(request);
    dataOutputStream.flush();
    ...
    // for response
    int resLen = dataInputStream.readInt();
    byte[] response = new byte[resLen];
    dataInputStream.read(response);
    ...
    

    i'v tried to use MINA to handle the request sent by my old clients(the clients have been deployed in many area and CodeChanging is forbidden), because of the noblocking of NIO, when one client calls writeInt(), write(), flush() methods orderly, my IoHandler would recevie data partly in many times. so in  IoHandler.messageRecevied(), it couldn't get the whole request data to do the business logic.
      
    who can give me some advice to handle tihs?

Best Regard!
                      LJ

                2007-05-15
              

= = = = = = = = = = = = = = = = = = = = = =