鉴于red5很好用,暂定red5作为摄像头的流媒体服务器(rtmp),先做出来玩玩试试。
这样一来,一个摄像头对应一个流媒体服务器,不知道还需不需要一个反向proxy server。
这样一来,架构就变了:
android端播放的时候不需要通过主服务器,直接连到流媒体服务器中就行了,好像主服务器就没必要存在了?我觉得还是得要,因为安全问题,因为酷。
因此还需要做一个主服务器来管理各个流媒体服务器,并作为android的服务端。
服务器继续用Java来做。
一、数据库方面:
二、后台整体分包:1、考虑到数据量与数据之间关系并不多,就一个地址,将来能增加的估计也就用户信息
2、考虑到用传统的数据库mysql、MariaDB或者sqlite等有点太浪费也麻烦
因此选择了不去做一个数据库,而是将内存进行到底,用一个文件来备份数据。
1、既然用内存作为持久层,那就用对象的形式。
2、考虑到要能备份到文件里,因此选用了json作为存储的数据类型。
3、考虑到内存大小,选用了单例来创造数据对象。
Spring配置(很基本的配置)1、dbo 我自创的类型,database object 数据库对象,命名有点牵强。
2、dao 持久层
3、common 一些通用的方法或工具
4、service 逻辑层
5、controller 表示层控制器
6、listener tomcat启动时要运行的一些东西(例如开启camera等)
1、pom.xml内容
2、web.xml内容<properties> <java-version>1.7</java-version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <org.springframework-version>3.1.4.RELEASE</org.springframework-version> <org.aspectj-version>1.7.3</org.aspectj-version> <org.slf4j-version>1.6.6</org.slf4j-version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- spring test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.1.4.RELEASE</version> </dependency> <!-- Jackson JSON Mapper --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.12</version> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework-version}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.15</version> </dependency> </dependencies>
3、application-context(spring部分)内容<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/application-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>com.hirra.listener.Init</listener-class> </listener> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>surveilance</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>surveilance</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <error-page> <error-code>404</error-code> <location>/WEB-INF/views/common/page_not_found.jsp</location> </error-page> </web-app>
四、spring注解4、servlet-context内容<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:annotation-config /> <context:component-scan base-package="com.hirra.dao" ></context:component-scan> <context:component-scan base-package="com.hirra.service" ></context:component-scan> <context:component-scan base-package="com.hirra.controller" ></context:component-scan> <import resource="web-context.xml" /> <import resource="servlet-context.xml" /> </beans>
5、web-context(springmvc)内容<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans:beans>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <!-- 开启注解 --> <mvc:annotation-driven /> <context:annotation-config /> <!-- 静态资源默认访问 --> <mvc:default-servlet-handler /> <!-- 开启扫描Controller --> <!-- <context:component-scan base-package="com.crazyapi.web.admin.controller" /> <context:component-scan base-package="com.crazyapi.web.controller" /> <context:component-scan base-package="com.crazyapi.web.controller.juhe" /> <context:component-scan base-package="com.crazyapi.web.validate" /> <context:component-scan base-package="com.crazyapi.web.utils" /> --> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="mediaTypes"> <map> <!-- 告诉视图解析器,返回的类型为json格式 --> <entry key="json" value="application/json" /> </map> </property> <property name="viewResolvers"> <list> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> </list> </property> </bean> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="org.springframework.security.access.AccessDeniedException">/WEB-INF/views/common/access_denied_page</prop> <prop key="java.io.Exception">/WEB-INF/views/common/page_not_found</prop> </props> </property> </bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> </list> </property> </bean> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> </beans>
五、利用junit进行各层的单元测试@repository dao层
@service service层
@controller web层控制器层
@component 表示一个组件,作用于任何层
@autowired 自动装载
@resource 通过名字装载
1、记得下spring-test的jar包
2、修改构建路径里的output folder,转至test-classes里
3、web层以下举例
4、web层举例@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/application-context.xml") public class TestIService { @Autowired private IUrlService service; @Test public void testDao() { } }
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/application-context.xml") public class TestController { @Autowired public RequestMappingHandlerAdapter handlerAdapter; @Autowired private UrlController urlController; private static MockHttpServletRequest request; private static MockHttpServletResponse response; @BeforeClass public static void before() { request = new MockHttpServletRequest(); request.setCharacterEncoding("UTF-8"); response = new MockHttpServletResponse(); } @Test public void testController() throws Exception { request.setRequestURI("/url"); request.setMethod(HttpMethod.POST.name()); ModelAndView mv = null; try { mv = handlerAdapter.handle(request, response, new HandlerMethod( urlController, "getAllUrls")); } catch (Exception e) { e.printStackTrace(); } System.out.println(mv); Assert.assertNotNull(mv); Assert.assertEquals(response.getStatus(), 200); } }