我有一个Java applet,它从服务器流式传输视频(MJPEG).我用C#(Windows服务)编写了一个代理服务器,放在applet和多个视频服务器之间.HTML/CSS/Js前端与Java applet一起使用.所有功能都可以正常工作(最后!!!),除了一件事.
视频服务器允许您通过REST界面播放录制的视频.剪辑完成后,服务器将打开连接,以防您想要发送倒带或搜索等命令.该剪辑在小程序中正常播放,直到结束.如果您尝试启动一个新剪辑(需要从Javscript向applet发送命令),浏览器会冻结.但是,后续使用相同连接的命令会起作用,例如播放,暂停和搜索.如果我停止Windows服务,浏览器将再次响应.
这就是我假设正在发生的事情:剪辑结束(或暂停); 不再发送数据但连接仍处于活动状态.applet正在等待下一帧的代理,但是代理正在视频服务器上等待下一帧,这不会再发送任何数据.
这是读取每个帧的while循环中的代码
byte[] img = new byte[mContentLength];
inputStream.skipBytes(headerLen);
inputStream.readFully(img);
Run Code Online (Sandbox Code Playgroud)
我需要以某种方式中断此代码.
当在HTML前端中选择新的视频片段时,我们通知applet,它在CameraStream类上调用disconnect().这就是这个功能:
// DataInputStream inputStream
// HttpURLConnection conn
public void disconnect() {
System.out.println("disconnect called.");
if(running) {
running = false;
try {
// close the socket
if(inputStream != null) {
inputStream.close();
}
if(conn != null) {
conn.disconnect();
}
inputStream = null;
System.out.println("closed.");
} catch(Exception ignored) {
System.out.println("exc:" + ignored.getMessage());
main.reportErrorFromThrowable(ignored);
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了测试这个,我让一个快速剪辑播放并运行到最后.然后我选择一个新剪辑.在我的Java控制台中,我得到了输出,disconnect called.但是我没有收到后续closed.消息,也没有抓到那个通用的异常.当我停止Windows服务时,我终于得到了closed.消息,所以它似乎inputStream.close();是阻塞.
所以我想我的问题是如何阻止阻止?是readFully(img) …
我有这样一个数组:
Array(
[Rating] => Array(
[0] => Array(
[id] => 4
[rating] => -1
),
[1] => Array(
[id] => 14
[rating] => 9.7
),
[2] => Array(
[id] => 26
[rating] => 9.55
)
)
)
Run Code Online (Sandbox Code Playgroud)
我需要从这个数组中提取所有的等级> = 0,并且只需要数字.我做得很好Set::extract('/Rating/rating[rating>-1]', $video)
但后来我了解到这已被弃用,你现在应该使用Hash类.所以我查了一下新语法并写道:
Hash::extract($video, 'Rating.{n}.rating[rating>-1]');
Run Code Online (Sandbox Code Playgroud)
这给了我正确的结果,但它给出了一个恼人的警告: Warning (4096): Argument 1 passed to Hash::_matches() must be an array, string given, called in E:\www\lib\Cake\Utility\Hash.php on line 131 and defined [CORE\Cake\Utility\Hash.php, line 170]
当我没有条件(但[rating>-1])时,警告不会发生,但当然包括-1,我不想要.我在这做错了什么?我是否以某种方式滥用了这个功能?我应该只使用已弃用的Set类吗?或者我应该忽略警告,因为一旦我将此应用程序置于生产模式,它就不会显示出来?
我正在编写一个Web应用程序(HTML/CSS/JS前端,C#后端),期望用户在同一页面上停留一段时间(通常超过10分钟).我想定期检查服务器以查看用户的会话是否已过期.使用setInterval,间隔为2到5分钟,向服务器发出AJAX请求是否有任何不利之处?