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

它没有用 - 请求超时。

这两个部分有什么区别?

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 回答