【问题标题】:Difference between .net TcpClient and Delphi2010 IdTCPClient.net TcpClient 和 Delphi2010 IdTCPClient 的区别
【发布时间】:2012-10-22 07:11:37
【问题描述】:

我有以下用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);

它没有用 - 请求超时。

这两部分有什么区别?

【问题讨论】:

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


    【解决方案1】:

    您的 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 行为,您需要自己在接收缓冲区中搜索行尾字符。

    【讨论】:

      猜你喜欢
      • 2011-07-26
      • 2021-01-19
      • 1970-01-01
      • 2012-05-16
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多