我在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);
它没有用 - 请求超时。
这两部分有什么区别?
答案 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
行为,则需要在接收缓冲区中搜索行尾字符。