1

私はdelphi2010で書かれた次のコードを持っています:

  TCPClient := TidTcpClient.Create;

  TCPClient.Host := '192.168.12.131';
  TCPClient.Port := 1312;

  TCPClient.Connect;

  TCPClient.IOHandler.WriteLn('msg', TEncoding.ASCII);
  answer := TCPClient.IOHandler.ReadLn(TEncoding.ASCII);

このコードはうまく機能します-答えが得られます。

そして、私は次のC#コードを持っています:

var client = new TcpClient();
client.Connect(endpoint);

var stream = client.GetStream();
var msgData = System.Text.Encoding.UTF8.GetBytes("msg");
stream.Write(msgData, 0, msgData.Length);

var answerData = new Byte[256];
var asnwerLength = stream.Read(answerData, 0, answerData.Length);

そしてそれはうまくいきませんでした - リクエストのタイムアウト。

これら2つの部分の違いは何ですか?

4

1 に答える 1

2

あなたの Delphi コードは (一見すると) 完全な行を書いています - おそらく行末文字がいくつかあります。多分サーバーはそれらを期待していますか?

試す:

var client = new TcpClient();
client.Connect(endpoint);

var stream = client.GetStream();
var msgData = System.Text.Encoding.UTF8.GetBytes("msg\r\n"); //Include line ending. Might just need \r or \n by themselves - consult server documentation, if available
stream.Write(msgData, 0, msgData.Length);

var answerData = new Byte[256];
var asnwerLength = stream.Read(answerData, 0, answerData.Length);

また、 はstream.Read現在利用可能な限りのデータを返すことに注意する必要があります。これは、サーバーからの完全なメッセージよりも少ない場合や、サーバーからのいくつかのメッセージ (の一部) が含まれる場合があります。動作を複製したい場合ReadLnは、受信バッファで行末文字を自分で検索する必要があります。

于 2012-10-19T09:29:35.663 に答える