【问题标题】:How can I fix conflicts of server received RTSP messages on TCP communication?如何解决 TCP 通信中服务器接收到的 RTSP 消息的冲突?
【发布时间】:2010-10-27 11:12:20
【问题描述】:

我想得到一些建议,因为我在向服务器发送 RTSP 消息的客户端之间存在冲突。 首先,我为我的英语向大家道歉。

嗯,我正在做的是一个 java 流视频 应用程序。

  • clients设置TCP服务器连接以交换RTSP消息

  • 服务器通过UDP客户端请求使用JPEG有效负载类型的RTP数据包中的帧,因为我的视频是MotionJPEG格式。

更具体一点:

  1. 服务器使用线程处理同一端口上的客户端 TCP 连接
  2. 连接的每个客户端都向服务器发送该端口要用于 UDP 传输的端口。

问题是服务器在 tcp 通信上接收和分析 RTSP 消息,但是当客户端更多地连接到服务器时,RTPS 消息会混淆订单,我的服务器想要转换为整数,其中只是字符串,从写入的“单播”中获取会话编号等等......

这是我为处理不同的客户所做的:

  ServerSocket socket = new ServerSocket(7777);
    while(true) {
        System.out.println("\nAspettando una connessione...");
        Socket incoming = socket.accept();
        Server server = new Server(incoming);
        Thread t = new Thread(server);
        t.start();
    }

我的类服务器实现 Runnable 来处理计时器 以播放、暂停和停止流式传输。

它可以向一个客户端提供视频流,但是服务器在来自冻结的客户端的 TCP 请求上混淆了 RTSP。如果我关闭这些并打开第三个,它会再次开始工作,因为服务器了解正在接收的内容。


更具体地说,服务器中的异常取决于客户端发送的 RTSP 消息。例如

$Server(应该接收 Cseq)从 (/192.168.0.4) 接收:Session: 12345678

$Server(应该接收 Cseq)来自 (/127.0.0.1):Cseq: 4

所以例外情况可能是:

Exception in thread "Thread-3" java.lang.NullPointerException
        at java.util.StringTokenizer.<init>(StringTokenizer.java:182)
        at java.util.StringTokenizer.<init>(StringTokenizer.java:219)
        at progetto2.Server.run(Server.java:91)
        at java.lang.Thread.run(Thread.java:619)

何时找到传输:RTP/UDP;unicast;client_port=8888\r\n 类似的东西(我很抱歉我在线程中丢失了异常)

    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:449)
    at java.lang.Integer.parseInt(Integer.java:499)
    at progetto2.Server.run(Server.java:108)
    at java.lang.Thread.run(Thread.java:619)

所以我应该处理不同的客户端,我应该使用不同的 TCP 端口吗? 很抱歉,但我记得在多客户端聊天中我没有遇到这些问题。 我希望以最好的方式解释我的问题。

感谢大家对我的帮助和建议!

亲切的问候!

【问题讨论】:

    标签: java sockets networking tcp client-server


    【解决方案1】:

    你描述的情况是不可能的。 TCP 不会重新排序消息,也不会合并来自不同客户端的消息。您的代码中有错误。可能某些东西是静态的,应该是您的 Server 类中的实例变量。

    【讨论】:

    • 就是这样!我将 BufferedReader、PrinterWriter、session 和其他变量声明为静态变量,主要是因为在我编写流式代码之前只是为了一个客户端通信。我并没有太在意改变。对不起。非常感谢!实际上现在它可以工作了,但几乎在流媒体服务器停止发送 UDP 数据包和客户端停止接收时结束,但没有抛出异常......任何想法?亲切的问候
    • 您期望什么异常,来自什么方法,什么条件下?
    • 我已经修好了...也许我只是累了。我忘记初始化从服务器端发送到 RTPpacket 构造函数的标头的序列号。因此,当当前图像的序列号增加并达到 500 帧的视频长度时,它会停止。即使我再次设置它也不会验证条件小于视频长度。如果您能回答,我会对其他格式的视频提出另一个问题。我正在使用 Mjpeg(26 有效负载类型)如果我使用 mpeg(32 有效负载)我希望服务器异常发送 udp 数据包:java.lang.NumberFormatException:对于输入字符串:“)H��
    • 嗯,它不是一个数字,是吗?如果没有看到代码或堆栈跟踪,就不可能进一步评论。我建议您将其作为一个单独的问题,并正确发布。
    • 非常感谢,我会在一段时间内完成!
    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2015-01-17
    • 2019-10-01
    • 2018-08-07
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多