一.需求 完成一个摄像头录像的服务器
1.要求主动的去摄像头抓数据.
2.生成目录,按照摄像头的名称 录像的日期生成文件夹,在文件夹中生成录像文件.
3.录像文件要求,在启动录像服务器后,开始录像,文件一个小时生成一个.
4.如果录像的时候因为网络或别的原因,网络断开了,在网络恢复后能自动录像.
二.控制录像 录像开关
1.设置String变量recStatus,用来保存录象的状态.start 表示录像开始,stop表示录像介绍.
2.设置boolean变量in_rec_time,用来判断当前时间是不是在录像时间内(一个小时的录像内容保存在一个文件内,设置整点的前3s和整点后3s这个区间为不在录像时间)
3.使用2个线程来维护录像时间的boolean变量,在线程中使用定时器Timer来定时,定时时间到,就触发录像事件boolean的变化.
4.开始录像时,设置reStatus为start,同时启动维护in_rec_time的线程.
5.为每个摄像头建立一个线程.每个线程控制一个摄像头的录像,启动线程,开始录像.使用while循环,判断条件是recStatus等于start.如果不能于strt,说明没有停止录像,再开始录像,实现重链接的机制.
6.关闭录像时,设置recStatus为stop,各个摄像头的线程在这个条件下结束,录像停止.
三.录像
1.创建保存录像的文件和目录.
2.根据摄像头的提供的ip和指定端口号,创建Socket,如果创建失败,那么延时5s在重新创建.
3.设置Socket的超时时间为1s.Socket.setSoTimeout(int ms),这个是为了防止在摄像头重启的时候,Socket是建立了,但是一直没有相应服务器端的请求,是程序一直处在等待状态.
4.发送开始命令.Socket.getOutputStream().write();
5.获得摄像头的输出.Socket.getInputStream()的InputStream对象.
6.创建文件输出流,FileOutputStream fos = new FileOutputStream(File file,boolean append); 其中append为true,这样文件可以续写.
7.读取InputStream的数据,写到fos中.
7.1 如果Socket有问题,或者是摄像头重启等,调用InputStream.read(),时会超时退出,抛出java.net.SocketTimeoutException异常.这个时候需要重新建立连接来录像.
7.2 如果read方法OK,而且是第一次得到数据,要判断录像数据的头,仅在read得到的数据的第一字节是"Y"的时候,得到的数据才是正常的,才能开始录像,否则,退出循环,重新录像.
7.3 如果在录像的时候,resStatus变为stop ,或者in_rec_time为false,表明录像要结束,或者要更换录像文件,这个时候,需要向摄像头发送关闭命令,发送3次,如果 InputStream.read() != -1 那么直接跳出循环,这样做是因为网络的不稳定性,有可能我们发送的停止命令,因为网络的原因摄像头没有接收到.
8.关闭Socket连接,返回.
1.要求主动的去摄像头抓数据.
2.生成目录,按照摄像头的名称 录像的日期生成文件夹,在文件夹中生成录像文件.
3.录像文件要求,在启动录像服务器后,开始录像,文件一个小时生成一个.
4.如果录像的时候因为网络或别的原因,网络断开了,在网络恢复后能自动录像.
二.控制录像 录像开关
1.设置String变量recStatus,用来保存录象的状态.start 表示录像开始,stop表示录像介绍.
2.设置boolean变量in_rec_time,用来判断当前时间是不是在录像时间内(一个小时的录像内容保存在一个文件内,设置整点的前3s和整点后3s这个区间为不在录像时间)
3.使用2个线程来维护录像时间的boolean变量,在线程中使用定时器Timer来定时,定时时间到,就触发录像事件boolean的变化.
4.开始录像时,设置reStatus为start,同时启动维护in_rec_time的线程.
5.为每个摄像头建立一个线程.每个线程控制一个摄像头的录像,启动线程,开始录像.使用while循环,判断条件是recStatus等于start.如果不能于strt,说明没有停止录像,再开始录像,实现重链接的机制.
6.关闭录像时,设置recStatus为stop,各个摄像头的线程在这个条件下结束,录像停止.
三.录像
1.创建保存录像的文件和目录.
2.根据摄像头的提供的ip和指定端口号,创建Socket,如果创建失败,那么延时5s在重新创建.
3.设置Socket的超时时间为1s.Socket.setSoTimeout(int ms),这个是为了防止在摄像头重启的时候,Socket是建立了,但是一直没有相应服务器端的请求,是程序一直处在等待状态.
4.发送开始命令.Socket.getOutputStream().write();
5.获得摄像头的输出.Socket.getInputStream()的InputStream对象.
6.创建文件输出流,FileOutputStream fos = new FileOutputStream(File file,boolean append); 其中append为true,这样文件可以续写.
7.读取InputStream的数据,写到fos中.
7.1 如果Socket有问题,或者是摄像头重启等,调用InputStream.read(),时会超时退出,抛出java.net.SocketTimeoutException异常.这个时候需要重新建立连接来录像.
7.2 如果read方法OK,而且是第一次得到数据,要判断录像数据的头,仅在read得到的数据的第一字节是"Y"的时候,得到的数据才是正常的,才能开始录像,否则,退出循环,重新录像.
7.3 如果在录像的时候,resStatus变为stop ,或者in_rec_time为false,表明录像要结束,或者要更换录像文件,这个时候,需要向摄像头发送关闭命令,发送3次,如果 InputStream.read() != -1 那么直接跳出循环,这样做是因为网络的不稳定性,有可能我们发送的停止命令,因为网络的原因摄像头没有接收到.
8.关闭Socket连接,返回.