.net TcpClient和Delphi2010 IdTCPClient之间的区别

时间:2012-10-19 09:04:50

标签: c# .net delphi delphi-2010 tcpclient

我在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);

它没有用 - 请求超时。

这两部分有什么区别?

1 个答案:

答案 0 :(得分: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行为,则需要在接收缓冲区中搜索行尾字符。