Java 识别\r\n.\r\n“;在从客户端发送到服务器的字符串中

Java 识别\r\n.\r\n“;在从客户端发送到服务器的字符串中,java,Java,我正在将应用程序中的多条消息从客户端发送到服务器,其中一条是“\r\n。\r\n”服务器如何在其他消息之间识别此消息? 我使用了equals()方法,但它不起作用: is = new BufferedReader(new InputStreamReader(socket .getInputStream())); String st = is.readLine(); if(st.equals("\r\n.\r\n")) // ........

我正在将应用程序中的多条消息从客户端发送到服务器,其中一条是“\r\n。\r\n”服务器如何在其他消息之间识别此消息? 我使用了equals()方法,但它不起作用:

 is = new BufferedReader(new InputStreamReader(socket
                    .getInputStream()));
 String st = is.readLine();
 if(st.equals("\r\n.\r\n"))
     // ........

如果这只是SMTP中单独一行上的“.”,那么您可以只使用
st.equals(“.”
,作为readLine()带出下线字符。但是,如果您需要确保它完全是“\r\n.\r\n”,而不是“\n.\n”,那么您可能应该避免readLine(),自己实现行读取,可能一个字符一个字符地读取。

如果这只是“.”在类似SMTP的单独行上,那么您可以使用
st.equals(“.”
,作为readLine()删除下线字符。但是,如果您需要确保它完全是“\r\n.\r\n”,而不是“\n.\n”,那么您可能应该避免readLine(),自己实现行读取,可能是逐个字符读取。

您是否知道
“\r\n”
是一个行删除器,这意味着它永远不会出现在
readLine
的结果中,更不用说两次了?你想要的是从客户那里找到完整消息的结尾,对吗?你好,为什么不找标签“”而不是回车return@Suresh,这看起来很像SMTP或类似的协议。这类协议通常不使用任何开始/结束标记,否则就不需要“.”终止符。@Suresh是的,我已经为SMTP邮件编写了解析器。您知道吗?
“\r\n”
是一个行删除器,这意味着它永远不会出现在
readLine
的结果中,更不用说两次了?你想要的是从客户那里找到完整消息的结尾,对吗?你好,为什么不找标签“”而不是回车return@Suresh,这看起来很像SMTP或类似的协议。此类协议通常不使用任何开始/结束标记,否则就不需要“.”终止符。@Suresh是的,我已经为SMTP邮件编写了解析器。确实如此。值得注意的是,对于readLine,\r\n和\n都表示行尾,如果需要区分它们,则需要编写自己的解析器。确实如此。很高兴注意到,对于readLine,\r\n和\n都表示行尾,如果需要区分它们,您需要编写自己的解析器。如果前一个“\r\n”没有被前一次对readLine()的调用或用于行读取的任何机制“吃掉”,这就很好了。@Sergey:前一次对readLine的调用是什么??InputStream被包装,然后立即标记为重置@埃尔顿:np;-)@Aafron,我的意思是“\r\n.\r\n”用于表示消息的结尾,但消息本身可以包含几行文本。如果在检查“\r\n.\r\n”之前使用readLine()读取这些行,则对readLine()的最后一次调用将耗尽终止的“\r\n”,然后您将无法再检查“\r\n.\r\n”,因为它将变成“\r\n”。只有在您确实有“\r\n\r\n.\r\n”或者您没有使用readLine()来读取邮件的前几行时,它才会起作用。如果前一个“\r\n”没有被前一次调用readLine()或任何用于读取行的机制“吃掉”,这就很好了。@Sergey:前一次调用readLine是什么??InputStream被包装,然后立即标记为重置@埃尔顿:np;-)@Aafron,我的意思是“\r\n.\r\n”用于表示消息的结尾,但消息本身可以包含几行文本。如果在检查“\r\n.\r\n”之前使用readLine()读取这些行,则对readLine()的最后一次调用将耗尽终止的“\r\n”,然后您将无法再检查“\r\n.\r\n”,因为它将变成“\r\n”。只有在您确实有“\r\n\r\n.\r\n”或未使用readLine()读取邮件的前几行时,此选项才有效。
is = new BufferedReader(new InputStreamReader(socket
                    .getInputStream()));

is.mark(5);
char[] tmp = new char[5];
is.read(tmp, 0, 5);

if(new String(tmp).equals("\r\n.\r\n"))
   // you have that message
else
   is.reset();