2

Java と freepascal(lazarus) アプリ間の通信に問題があります。ソケットを使用しています。それらは正しく接続されます。あるアプリから別のアプリに何かを送信するまで、すべてがスムーズに進んでいます。「abc」の代わりにJavaでは、ランダムな文字があります。コードは次のとおりです。

ジャワ:

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

Pascal側では、「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 型ですか? なぜ同じ文字列を 2 回送信するのでしょうか。

Java 側から見ると、これも奇妙に見えます。

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

最初に、あるバイト数 (最大 10000) を配列に読み取り、次に、読み取ったバイト数の長さでbytesTest新しい配列を作成します。そして、配列bytesをもう一度読み込もうとします (今回は、持っている量を数えません) 。bytes

これが他の Java ピアで動作する場合は、これを確認したいと思います。


行く方法は、最初に byte[] の長さを送信し、次にこのバイト数を送信することです。読み取り側では、正しいバイト数を読み取るようにしてください。

于 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 に答える