最近在用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通信这方面的东西,望指教.
客户端使用流和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通信这方面的东西,望指教.
但0以外的值,客户端和服务端总是会不一致.
楼主在发送的时候,也需要作一下host to network字节序转换.
uses IdWinsock;//INDY控件包与WIN SOCKET API均有HTON函数定义,随便用哪儿的都行.
....initcode:=13;
initcode:=Htonl(initcode);
....
那从java服务端传送回来的数据,是不是也要做一次这样的操作?
HTONL,HTONS这类函数只针对32位和16位的整型数?
我试了一下这个类型,
发现shortint类型的数据不需要经过htons()转换,
直接传送,
java服务端用read(byte[] b)能够正确的读出来,
用了htons()反而读不出来正确的数据.
java里面只有读int型的时候才是按照网络字节的?
BYTE是一个字节,倒过来倒过去还不是它自己.
delphi里面还有一个int64的,
网络传输的时候怎么处理?
前面几个函数最高也才针对的32位
传过去的字符串,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客户端这边该如何处理?
s1.Write(u2,sizeof(u2)); 应该改成
s1.Write(pchar(u2)^,length(u2));
...
...
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);