最近在用delphi7做一个PC客户端,
客户端使用流和idhttp控件与java服务端进行通信,
遇到的问题是客户端这边传送过去的数据,
服务端读出的数据总是和客户端送出的数据不一致,
例如下面这段delphi客户端代码:
var
s1:TMemoryStream;
url:string;
initcode:integer;
begin
idhttp1.Request.ContentType:='application/octet-stream';
s1:=TMemoryStream.Create();
initcode:=13;
url:='http://127.0.0.1:8080/work/servlet/test';
s1.Write(initcode,sizeof(initcode));
idhttp1.Post(url,s1);
end;java服务端对应的读取数据代码是:
InputStream is = request.getInputStream();
DataInputStream call = new DataInputStream(is);
int initCode = call.readInt();
System.out.println("initCode=" + initCode);但服务端得到的initCode值并不是13,而是218103808,
这是怎么回事,有人给解释一下吗.
第一次做与java通信这方面的东西,望指教.

解决方案 »

  1.   

    但如果delphi客户端这边initcode值为0的话,java客户端得到的initcode值也是0,
    但0以外的值,客户端和服务端总是会不一致.
      

  2.   

    感觉是不是Integer(Delphi)长度和Java的int不一致。你可以看看相关的文档。
      

  3.   

    218103808 转换成16进制是D000000,正好与13的序列倒过来.JAVA从二进制流里面读INT型是按网络字节续读的.
    楼主在发送的时候,也需要作一下host to network字节序转换.
    uses IdWinsock;//INDY控件包与WIN SOCKET API均有HTON函数定义,随便用哪儿的都行.
    ....initcode:=13; 
    initcode:=Htonl(initcode); 
    ....
      

  4.   

    2楼的,delphi里面integer和java里的int长度是一样的
      

  5.   

    可以了,通过了.
    那从java服务端传送回来的数据,是不是也要做一次这样的操作?
    HTONL,HTONS这类函数只针对32位和16位的整型数?
      

  6.   

    由于delphi中shortint这个类型和java中的byte类型是对应的,
    我试了一下这个类型,
    发现shortint类型的数据不需要经过htons()转换,
    直接传送,
    java服务端用read(byte[] b)能够正确的读出来,
    用了htons()反而读不出来正确的数据.
    java里面只有读int型的时候才是按照网络字节的?
      

  7.   

    32位是4字节,16位是2个字节,转换网络字节主要就是倒倒序而已.
    BYTE是一个字节,倒过来倒过去还不是它自己.
      

  8.   

    我把byte当成了2字节,低级错误...
    delphi里面还有一个int64的,
    网络传输的时候怎么处理?
    前面几个函数最高也才针对的32位
      

  9.   

    给java服务端传送字符串的时候也有问题,
    传过去的字符串,java服务端在读取时直接报错,下面是出错的例子:delphi端var 
    s1:TMemoryStream; 
    url:string; 
    u1:WideString;
    u2:UTF8String;
    begin 
    idhttp1.Request.ContentType:= 'application/octet-stream '; 
    s1:=TMemoryStream.Create(); 
    u1:='1111';
    u2:=UTF8Encode(u1);
    url:= 'http://127.0.0.1:8080/work/servlet/test '; 
    s1.Write(u2,sizeof(u2)); 
    idhttp1.Post(url,s1); 
    end; java服务端对应的读取数据代码是: 
    InputStream is = request.getInputStream(); 
    DataInputStream call = new DataInputStream(is); 
    System.out.println("begin read");//执行到这里,下面就报错了
    String u1 = call.readUTF();
    System.out.println(u1);是不是传送字符串的时候也存在着字节序的问题而需要转换字节序,
    delphi客户端这边该如何处理?
      

  10.   

    先忽略其它问题,楼主发送字符串DELPHI代码这儿错了
    s1.Write(u2,sizeof(u2));  应该改成
    s1.Write(pchar(u2)^,length(u2));
      

  11.   

    给java服务端传送字符串的delphi代码:use WinSock;
    ...
    ...
    var 
        s,url:String;
        ss:UTF8String;
        p:PChar;
        b:array   of   Byte;
        i:integer;     
        stream:TMemoryStream;
        ln:smallint;  
    begin
        stream:=TMemoryStream.Create();  
        url:='http://127.0.0.1:8080/work/servlet/test';
        s:= '他,中国人' ;
        ss:=UTF8Encode(s);   
        ln:=Length(ss);    
        ln:=Htons(ln);     //写入两个字节,表示字符串长度,然后写入UTF-8格式的字符串,配合java的readUTF()方法                       
        stream.Write(ln,sizeof(ln)); 
        SetLength(b,Length(ss)+1);
        p:=PChar(ss);
        CopyMemory(b,p,Length(ss)+1); 
        for i:=0 to Length(ss) do
        stream.Write(b[i],1);     
        idhttp1.Post(url,stream); 
    end;java服务端对应的读取数据代码:  
    InputStream is = request.getInputStream();  
    DataInputStream call = new DataInputStream(is);  
    System.out.println("begin read");
    String s = call.readUTF(); 
    System.out.println(s);