使用Indy(Delphi)发送和接收简单字符串值

使用Indy(Delphi)发送和接收简单字符串值,delphi,indy,Delphi,Indy,有没有不使用WriteLN和ReadLN发送简单文本(字符串值)的方法? ReadLn函数需要LF字符,当我通过winsock向Indy发送文本消息时,ReadLn无法正确获取消息,一些异常将持续发生。您的文本是否有终止字符?如果是,那么您可以设置ReadLn的终止符参数,这样,当到达您自己定义的终止符时,它将终止读取,而不是LF字符 如果没有定义的终止字符,但您知道文本的最大长度,则可以设置ReadLn的AMaxLineLength参数。这将导致ReadLn只接受长度小于AMaxLineLen

有没有不使用WriteLN和ReadLN发送简单文本(字符串值)的方法?

ReadLn
函数需要LF字符,当我通过winsock向Indy发送文本消息时,
ReadLn
无法正确获取消息,一些异常将持续发生。

您的文本是否有终止字符?如果是,那么您可以设置ReadLn的终止符参数,这样,当到达您自己定义的终止符时,它将终止读取,而不是LF字符

如果没有定义的终止字符,但您知道文本的最大长度,则可以设置ReadLn的AMaxLineLength参数。这将导致ReadLn只接受长度小于AMaxLineLength的文本


如果没有定义的终止字符,并且您不知道接收文本的最大长度,则可以使用ReadStream,将AReadUntilDisconnect参数设置为True,而不是使用ReadLn。当然,ReadStream以字节流的形式读取数据。您可以将TStringStream分配给它,这样您就可以将接收到的字节作为字符串。AReadUntilDisconnect参数告诉ReadStream继续读取接收到的数据,直到客户端断开连接。因此,如果您设置了此参数,您的客户端应该在文本发送到服务器后立即断开连接。

您的文本是否有任何终止字符?如果是,那么您可以设置ReadLn的终止符参数,这样,当到达您自己定义的终止符时,它将终止读取,而不是LF字符

如果没有定义的终止字符,但您知道文本的最大长度,则可以设置ReadLn的AMaxLineLength参数。这将导致ReadLn只接受长度小于AMaxLineLength的文本


如果没有定义的终止字符,并且您不知道接收文本的最大长度,则可以使用ReadStream,将AReadUntilDisconnect参数设置为True,而不是使用ReadLn。当然,ReadStream以字节流的形式读取数据。您可以将TStringStream分配给它,这样您就可以将接收到的字节作为字符串。AReadUntilDisconnect参数告诉ReadStream继续读取接收到的数据,直到客户端断开连接。因此,如果您设置了此参数,您的客户端应该在文本发送到服务器后立即断开连接。

如果您不希望使用终止字符(WriteLn/ReadLn这样做),则先将希望发送到套接字的字节数写入,然后写出,或在另一端读取那么多字节。您还可以使用不同于换行符的终止字符,换行符是您从帽子中适时拉出的。也许Chr(251),这是一个很好的例子


最后,我打赌你会回到WriteLn/ReadLn。因为它是简单的、预期的,并且可以工作。

如果您不希望使用终止字符(WriteLn/ReadLn这样做),那么请先将希望发送到套接字的字节数写入,然后写出,或者在另一端读取那么多字节。您还可以使用不同于换行符的终止字符,换行符是您从帽子中适时拉出的。也许Chr(251),这是一个很好的例子


最后,我打赌你会回到WriteLn/ReadLn。因为它是简单的、预期的,而且有效。

您可以发布代码示例吗?您可以发布代码示例吗?谢谢,当我使用ReadStream并将AReadUntilDisconnect参数设置为True时,我的客户端需要从服务器获得响应(使用ReadLn)因此我无法关闭连接。如果您提前知道字符串的完整长度,请使用ReadString()而不是ReadLn()。如果您使用ReadLn()的AMaxLineLength参数,而客户端没有发送那么多字符,那么ReadLn()将被阻止,等待永远不会到达的数据。谢谢,当我使用ReadStream且AReadUntilDisconnect参数设置为True时,我的客户端需要从服务器获得响应(使用ReadLn)因此我无法关闭连接。如果您提前知道字符串的完整长度,请使用ReadString()而不是ReadLn()。如果您使用ReadLn()的AMaxLineLength参数,而客户端不发送那么多字符,那么ReadLn()将被阻止,等待永远不会到达的数据。最后,我打赌您将返回WriteLn/ReadLn。因为它是简单的,预期的,而且有效。正如我所说的,当我在服务器上使用ReadLn时,如果一个未知的客户端(例如winsock)发送一条没有LF char的消息,一些异常将持续发生!看见在visual basic中,我们使用了“SendData”和“GetData”方法,可以发送任何字符串值,而无需指定LF char和数据长度。谢谢,从我所读到的内容来看,无法保证GetData能够准确读取对SendData的单个调用所写的内容。对SendData的多个调用可能被分组到一个数据块中。听起来你很幸运,如果那件事没发生在你身上,克里米亚。底线是发送方和接收方需要通过使用公共协议进行合作。如果接收器不应该读取所有内容,那么它需要知道何时停止,或者被告知需要多少字节,或者通过识别表示“停止读取”的特殊数据序列。只要您还使用WriteLn,ReadLn就可以。@Kermia:关于continos异常,您没有正确处理断开连接。只有当服务器代码在try/except块中包装其读取内容并丢弃捕获的所有异常时,才会发生您所描述的情况。不要放弃Indy自己的任何EIdException派生异常。如果你抓住了它们,然后重新抛出它们,让服务器在内部处理它们。谢谢你,勒博先生!我不知道“尝试/例外”有时是杀人犯:D!我的问题解决了。最后,我打赌你会回到WriteLn/ReadLn。因为它是简单的,预期的,而且有效。正如我所说,当我在s上使用ReadLn时