2

我在 java 和 freepascal(lazarus) 应用程序之间的通信有问题。我使用插座。它们正确连接。一切都很顺利,直到我想将一些东西从一个应用程序发送到另一个应用程序。在 java 而不是“abc”中,我有随机字符。继承人的代码:

爪哇:

ServerSocket serverSocket = new ServerSocket(1025);  
Socket client = serverSocket.accept();  
InputStream is = client.getInputStream();  
byte bytesTest[] = new byte[10000];  
byte bytes[] = new byte[is.read(bytesTest)];  
is.read(bytes);  
String textReceived = new String(bytes, "UTF-8");  
System.out.println(textReceived);

FP:

connect(socket, socket_info, SizeOf(socket_info));  
S := 'abcd';  
res := UTF8Bytes(S);  
send(socket, res, sizeof(res), 0);  
send(socket, res, sizeof(res), 0);

function UTF8Bytes(const s: UTF8String): TArray;  
begin  
  SetLength(Result, Length(s)+1);  
  if Length(Result)>0 then  
    Move(s[1], Result[0], Length(s));  
  Result[high(Result)] := 0;  
end;       
4

3 回答 3

2

在帕斯卡方面,假设 'TArray' 是一个字节数组,您不是在发送缓冲区的内容,而是在发送它的地址。此外,不是指定数据的长度,而是指定指针的大小。试试这个:

send(socket, res[0], Length(res), 0);
于 2011-03-09T00:14:01.763 回答
1

在不真正了解 Pascal 的情况下(我大约在 12 年前使用它),您的 UTF8Byte 函数看起来很可疑。

function UTF8Bytes(const s: UTF8String): TArray;  
begin  
  SetLength(Result, Length(s)+1);  
  if Length(Result)>0 then  
    Move(s[1], Result[0], Length(s));  
  Result[high(Result)] := 0;  
end;

什么是类型TArray,它真的是一个字节数组吗?您是否尝试在末尾添加一个 0 字节?为什么?

另外,你在这里做什么?

S := 'abcd';
res := UTF8Bytes(S);
send(socket, res, sizeof(res), 0);
send(socket, res, sizeof(res), 0);

S 是 UTF8String 类型的吗?为什么要发送相同的字符串两次?

现在对于您的 Java 端,它看起来也很奇怪。

byte bytesTest[] = new byte[10000];
byte bytes[] = new byte[is.read(bytesTest)];
is.read(bytes);

首先,您将一些字节数(最多 10000 个)读入bytesTest数组,然后创建一个新数组bytes,其长度为您刚刚读取的字节数。bytes然后你尝试再次读取数组中的内容(这次不计算你有多少) 。

如果这适用于其他一些 Java 同行,我想看看这个。


要走的路是首先发送你的字节[]的长度,然后发送这么多字节。在读取方面,请确保您读取了正确数量的字节。

于 2011-03-08T16:44:05.817 回答
0

这是网络字节排序问题吗?我对 FP 了解不多,但是快速搜索该主题会在此页面上找到一些约定:

http://www.indyproject.org/sockets/teams/core/docs/standards/FreePascal.EN.aspx

您可能需要在发送前进行主机到网络字节排序,然后在使用 FP 接收时进行网络到主机字节排序。

于 2011-03-08T16:42:03.123 回答