【发布时间】:2020-04-01 04:33:15
【问题描述】:
我想用 Delphi 中的 C# 和 TCPCLIENT 链接 tcp 服务器编程。 当客户端发送更多请求时我如何从服务器接收数据解释了想要从服务器接收响应我使用每种方法但数据为空。
C#
private Dictionary<string, Message> _networkStreams = new Dictionary<string, Message>();
private void SimpleTcpClientOnDataReceived(object sender, Message e)
{
string Data = e.MessageString.Replace("\u0013", "");
Request request = JsonConvert.DeserializeObject<Request>(Data);
Message message = _networkStreams[request.RequestId];
message.Reply(request.Data);
}
德尔福代码
procedure TfrmList.btnsortClick(Sender: TObject);
var Request:TRequest;
I: Integer;
JsonArray: TJSONArray;
ArrayElement: TJSonValue ;
JSonValue: TJSonValue;
item:TListItem;
begin
Request := TRequest.Create;
Request.Link := '/GetAll';
Request.Password := 'Password';
IdTCPClient1.IOHandler.Write(TJson.ObjectToJsonString(Request));
Memo1.Text := Memo1.Lines.Add(IdTCPClient1.IOHandler.ReadLnWait(600));
end;
谢谢。
【问题讨论】:
-
问题不清楚。尝试用谷歌翻译简单的短句。
-
我改问题请帮帮我:D
-
您的协议似乎没有链接控制(如标记的传输、消息长度优先有效负载等)。可能服务器期望在序列化消息的末尾换行?如果是这种情况,请尝试在发送序列化 json 消息后添加行
IdTCPClient1.IOHandler.Write('\n');。在服务器端使用调试器查看服务器是否完全收到消息并发送响应。嗅探器的使用也可以让你很快找出谁是罪魁祸首(客户端/服务器) -
你好@MaximSagaydachny 这不行
IdTCPClient1.IOHandler.Write('\n');我也试试这个但不行string replyMessage = String.Format("You said {0}", e.MessageString); //This is the reply message e.ReplyLine(replyMessage); //Send reply message back to client. e.Reply("Hello User"); return; -
@MaximSagaydachny 客户端正在发送 JSON,这是一种自定界格式,因此发送像链接中断这样的终止符并不是绝对必要的(另外,仅供参考,IOHandler 有一个
WriteLn()方法) .但是如果不知道服务器期望的确切格式,或者它返回的确切格式,就无法回答这个问题。