如何从RTSP消息的内容中提取会话ID?

时间:2016-10-21 14:01:25

标签: java string substring

我有一个这样的字符串:

RTSP/1.0 200 OK
CSeq: 3
Server: Ants Rtsp Server/1.0
Date: 21 Oct 2016 15:55:30 GMT
Session: 980603187; timeout=60
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=F006B800

我想提取会话编号(980603187

有人可以提供一些帮助吗?

4 个答案:

答案 0 :(得分:5)

只需在组中使用regular expression,然后将组的值提取为下一个:

String content ="RTSP/1.0 200 OK\n" +
   "CSeq: 3\n" +
   "Server: Ants Rtsp Server/1.0\n" +
   "Date: 21 Oct 2016 15:55:30 GMT\n" +
   "Session: 980603187; timeout=60\n" +
   "Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=F006B800\n";
Pattern pattern = Pattern.compile("Session: ([a-zA-Z0-9$\\-_.+]+)");
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
    System.out.println(matcher.group(1));
}

<强>输出:

980603187

<强>解释

Session: ([a-zA-Z0-9$\\-_.+]+)
  • Session:字面匹配字符Session:(区分大小写)
  • ([a-zA-Z0-9$\\-_.+]+):捕获与多个连续的ALPHA,DIGIT或SAFE字符匹配的组(至少一个)(cf RFC 2326 chapter 3.4 Session Identifiers

答案 1 :(得分:2)

使用正则表达式!拥有String str = ..,提取正则表达式在Session:;之间捕获任何内容所需的数字:

Session: (.+);

可以只指定字母\\w+或数字\\d+。注意Java中的双重转义。第一个匹配的m.group(1)是您的结果:

Pattern p = Pattern.compile("Session: (.+);");
Matcher m = p.matcher(str);

if (m.find()) {
    System.out.println(m.group(1));
}

输出980603187。请查看Regex101以获取解释。

在以下情况下,; timeout是可选的,需要修改使用的正则表达式:

Session: (.+?)[\n;]

答案 2 :(得分:2)

获得每个标头后,您可以在RFC 2336中查找指定RTSP协议的规范。

首先,您应该将字符串拆分为多行。根据规范,线以CR / LF结束。第一行表示响应,另一行表示标题字段。

定义是:

 Session  = "Session" ":" session-id [ ";" "timeout" "=" delta-seconds ]

其中session-id指定为:

 session-id   =   1*( ALPHA | DIGIT | safe )

这意味着你不应该把它与数字混淆。安全的定义是

   safe               =  "\$" | "-" | "_" | "." | "+"

和alpha表示所有大写和小写的数字。这意味着顺便说一下,可以放入一个base 64 url​​编码的二进制session-id。

好的,现在它成了寻找会话ID的问题。您遍历所有行(第一行除外),然后查找匹配的行:

   ^Session[ \t]*:[ \t]*([a-zA-Z0-9\$\-_.+]+).*$

这将仅匹配有效的会话标头/有效会话标识符。请注意,标准对于空格是模糊的,所以我在冒号':'之前和之后跳过了空格和制表符。然后,会话标识符位于正则表达式的第1组中。

当然,一旦需要,您可以通过在正则表达式中包含超时来轻松扩展它。

请注意,在Java中使用正则表达式之前,必须双重转义反斜杠字符。也可以使用Pattern类中定义的Posix字符类来使正则表达式更具可读性。

答案 3 :(得分:0)

如果在依赖项中使用apache-commons,则可以在一行内完成:

StringUtils.substringBetween(string, "Session: ", ";");