Commit 63e8b99d0f42f321a6dbe3d2059e4c999e690617

Authored by 张宗朋
1 parent 24e5d13e

lii

src/main/java/com/cnlive/mz/live/action/SocketServer.java 0 → 100644
  1 +package com.cnlive.mz.live.action;
  2 +
  3 +import java.io.IOException;
  4 +import java.io.InputStream;
  5 +import java.io.ObjectInputStream;
  6 +import java.io.ObjectOutputStream;
  7 +import java.net.ServerSocket;
  8 +import java.net.Socket;
  9 +import java.util.HashMap;
  10 +import java.util.Map;
  11 +import java.util.concurrent.ConcurrentHashMap;
  12 +
  13 +public class SocketServer{
  14 +
  15 + /**
  16 + * 要处理客户端发来的对象,并返回一个对象,可实现该接口。
  17 + */
  18 + public interface ObjectAction{
  19 + Object doAction(Object rev);
  20 + }
  21 +
  22 + public static final class DefaultObjectAction implements ObjectAction{
  23 + public Object doAction(Object rev) {
  24 + System.out.println("处理并返回:"+rev);
  25 + return rev;
  26 + }
  27 + }
  28 +
  29 + public static void main(String[] args) {
  30 + int port = 65432;
  31 + SocketServer server = new SocketServer(port);
  32 + server.start();
  33 + }
  34 +
  35 + private int port;
  36 + private volatile boolean running=false;
  37 + private long receiveTimeDelay=3000;
  38 + private ConcurrentHashMap<Class, ObjectAction> actionMapping = new ConcurrentHashMap<Class,ObjectAction>();
  39 + private Thread connWatchDog;
  40 +
  41 + public SocketServer(int port) {
  42 + this.port = port;
  43 + }
  44 +
  45 + public void start(){
  46 + if(running)return;
  47 + running=true;
  48 + connWatchDog = new Thread(new ConnWatchDog());
  49 + connWatchDog.start();
  50 + }
  51 +
  52 + @SuppressWarnings("deprecation")
  53 + public void stop(){
  54 + if(running)running=false;
  55 + if(connWatchDog!=null)connWatchDog.stop();
  56 + }
  57 +
  58 + public void addActionMap(Class<Object> cls,ObjectAction action){
  59 + actionMapping.put(cls, action);
  60 + }
  61 +
  62 + class ConnWatchDog implements Runnable{
  63 + public void run(){
  64 + try {
  65 + ServerSocket ss = new ServerSocket(port,5);
  66 + while(running){
  67 + System.out.println("准备客服端请求。。。");
  68 + Socket s = ss.accept();
  69 + new Thread(new SocketAction(s)).start();
  70 + }
  71 + } catch (IOException e) {
  72 + e.printStackTrace();
  73 + SocketServer.this.stop();
  74 + }
  75 + }
  76 + }
  77 +
  78 + class SocketAction implements Runnable{
  79 + Socket s;
  80 + boolean run=true;
  81 + long lastReceiveTime = System.currentTimeMillis();
  82 + public SocketAction(Socket s) {
  83 + this.s = s;
  84 + }
  85 + public void run() {
  86 + Map <String,Object> map = new HashMap<String,Object>();
  87 + /* try {
  88 + Thread.sleep(10);//设置多少时间读一次客户端请求。。
  89 + } catch (InterruptedException e1) {
  90 + e1.printStackTrace();
  91 + } */
  92 + while(running && run){
  93 + if(System.currentTimeMillis()-lastReceiveTime>receiveTimeDelay){
  94 + System.out.println(System.currentTimeMillis()-lastReceiveTime);
  95 + overThis();
  96 + }else{
  97 + try {
  98 + InputStream in = s.getInputStream();
  99 + if(in.available()>0){
  100 + ObjectInputStream ois = new ObjectInputStream(in);
  101 + Object obj = ois.readObject();
  102 + lastReceiveTime = System.currentTimeMillis();
  103 + String str = (String) obj;
  104 + String[] aa =str.split("#");
  105 + map.put("spId", aa[0]);
  106 + map.put("activityId", aa[1]);
  107 + System.out.println("接收:\t"+obj);
  108 + ObjectAction oa = actionMapping.get(obj.getClass());
  109 + oa = oa==null?new DefaultObjectAction():oa;
  110 + Object out = oa.doAction(obj);
  111 + if(out!=null){
  112 + ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
  113 + oos.writeObject(out);
  114 + oos.flush();
  115 + }
  116 + }else{
  117 + Thread.sleep(10);
  118 + }
  119 + } catch (Exception e) {
  120 + System.out.println(System.currentTimeMillis()-lastReceiveTime);
  121 + e.printStackTrace();
  122 + overThis();
  123 + }
  124 + }
  125 + }
  126 + }
  127 +
  128 + private void overThis() {
  129 + if(run)run=false;
  130 + if(s!=null){
  131 + try {
  132 + s.close();
  133 + } catch (IOException e) {
  134 + e.printStackTrace();
  135 + }
  136 + }
  137 + System.out.println("关闭:"+s.getRemoteSocketAddress());
  138 + }
  139 +
  140 + }
  141 +
  142 +}
... ...
src/main/java/com/cnlive/mz/live/action/VideoAction.java
... ... @@ -107,7 +107,7 @@ public class VideoAction {
107 107 tLive.setDescription(description);
108 108 tLive.setStart_time(new Date());
109 109 tLive.setUser_uuid(params.getString("name"));
110   - tLive.setRelation_id(relation_id);
  110 + tLive.setRelation_id(Integer.parseInt(relation_id));
111 111 tLive.setCustom_args(custom_args);
112 112 uuid = tLive.getUuid();
113 113 if (StringUtils.isEmpty(direct)) {
... ...
src/main/java/com/cnlive/mz/live/servlet/InitServlet.java 0 → 100644
  1 +package com.cnlive.mz.live.servlet;
  2 +
  3 +import java.io.IOException;
  4 +import javax.servlet.ServletConfig;
  5 +import javax.servlet.ServletException;
  6 +import javax.servlet.annotation.WebServlet;
  7 +import javax.servlet.http.HttpServlet;
  8 +import javax.servlet.http.HttpServletRequest;
  9 +import javax.servlet.http.HttpServletResponse;
  10 +
  11 +import com.cnlive.mz.live.action.SocketServer;
  12 +
  13 +/**
  14 + * Servlet implementation class InitServlet
  15 + */
  16 +@WebServlet(name = "initServlet", urlPatterns = { "/initServlet" })
  17 +public class InitServlet extends HttpServlet {
  18 + private static final long serialVersionUID = 1L;
  19 +
  20 + /**
  21 + * @see HttpServlet#HttpServlet()
  22 + */
  23 + public InitServlet() {
  24 + super();
  25 + // TODO Auto-generated constructor stub
  26 + }
  27 +
  28 + /**
  29 + * @see Servlet#init(ServletConfig)
  30 + */
  31 + public void init(ServletConfig config) throws ServletException {
  32 + System.out.println(".......init");
  33 + int port = 65432;
  34 + SocketServer server = new SocketServer(port);
  35 + server.start();
  36 + }
  37 +
  38 + /**
  39 + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  40 + */
  41 + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  42 + // TODO Auto-generated method stub
  43 + response.getWriter().append("Served at: ").append(request.getContextPath());
  44 + }
  45 +
  46 + /**
  47 + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  48 + */
  49 + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  50 + // TODO Auto-generated method stub
  51 + doGet(request, response);
  52 + }
  53 +
  54 +}
... ...
src/main/resources/stream-config.properties 0 → 100644
  1 +# file stored repository (Chinese words need ASCII, help tool @http://tool.oschina.net/encode?type=3)
  2 +STREAM_FILE_REPOSITORY=
  3 +
  4 +# when the file has uploaded, whether delete it.
  5 +STREAM_DELETE_FINISH=false
  6 +
  7 +# this server whether allow other different domain[s] upload file to this server
  8 +STREAM_IS_CROSS=false
  9 +
  10 +# allowed domain (PS: flash method need modifying the `crossdomain.xml`)
  11 +STREAM_CROSS_ORIGIN=*
  12 +
  13 +# when Browser @http:www.A.com, the file will upload to @STREAM_CROSS_SERVER
  14 +STREAM_CROSS_SERVER=http://customers.duapp.com
... ...
src/main/webapp/WEB-INF/tags/pager3.tag 0 → 100644
  1 +<%@ tag pageEncoding="UTF-8"%>
  2 +<%@ include file="/pages/common/taglib.jsp"%>
  3 +<%@ attribute name="id" required="true" type="java.lang.String"%>
  4 +<%@ attribute name="pager" required="true" type="org.smart4j.framework.dao.bean.Pager"%>
  5 +<c:set var="pageNumber" value="${pager.pageNumber}" />
  6 +<c:set var="pageSize" value="${pager.pageSize}" />
  7 +<c:set var="totalRecord" value="${pager.totalRecord}" />
  8 +<c:set var="totalPage" value="${pager.totalPage}" />
  9 +
  10 +<div class="css-row">
  11 + <div class="css-right">
  12 + <div id="${id}">
  13 + <!-- <span>每页记录数:</span>
  14 + ${pageSize} -->
  15 + <div class="css-button-group ext-pager-button">
  16 + <c:choose>
  17 + <c:when test="${pageNumber > 1 && pageNumber <= totalPage}">
  18 + <button class="btn btn-xs btn-danger" type="button" onclick="next_pager(1);" data-pn="1">|第一页</button>
  19 + <button class="btn btn-xs btn-danger" type="button" onclick="next_pager(${pageNumber - 1});" data-pn="${pageNumber - 1}">&lt;上一页</button>
  20 + </c:when>
  21 + <c:otherwise>
  22 + <button class="btn btn-xs btn-danger" type="button" disabled>|&lt;首页</button>
  23 + <button class="btn btn-xs btn-danger" type="button" disabled>&lt;上一页</button>
  24 + </c:otherwise>
  25 + </c:choose>
  26 + <span class="green middle bolder">${pageNumber}/${totalPage}</span>
  27 + <c:choose>
  28 + <c:when test="${pageNumber < totalPage}">
  29 + <button class="btn btn-xs btn-danger" type="button" onclick="next_pager(${pageNumber + 1});" data-pn="${pageNumber + 1}">下一页&gt;</button>
  30 + <button class="btn btn-xs btn-danger" type="button" onclick="next_pager(${totalPage});" data-pn="${totalPage}">最后一页&gt;|</button>
  31 + </c:when>
  32 + <c:otherwise>
  33 + <button class="btn btn-xs btn-danger" type="button" disabled>下一页&gt;</button>
  34 + <button class="btn btn-xs btn-danger" type="button" disabled>最后一页&gt;|</button>
  35 + </c:otherwise>
  36 + </c:choose>
  37 + <span class="green middle bolder">总记录数:${totalRecord}</span>
  38 + </div>
  39 + </div>
  40 + </div>
  41 +</div>
0 42 \ No newline at end of file
... ...
src/main/webapp/pages/live/search_management.jsp 0 → 100644
  1 +<%@ page language="java" pageEncoding="UTF-8"%>
  2 +<%@ include file="/pages/common/taglib.jsp"%>
  3 +<!DOCTYPE html>
  4 +<html>
  5 +<head>
  6 +<meta charset="UTF-8">
  7 +<title>直播活动管理 | <f:message key="common.title" /></title>
  8 +<meta
  9 + content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no'
  10 + name='viewport'>
  11 +<%@ include file="/pages/common/css.jsp"%>
  12 +</head>
  13 +<body class="skin-blue fixed ">
  14 + <div class="wrapper">
  15 + <%@ include file="/pages/common/top.jsp"%>
  16 + <%@ include file="/pages/common/left.jsp"%>
  17 + <div class="content-wrapper">
  18 + <!-- Content Header (Page header) -->
  19 + <section class="content-header">
  20 + <h1>直播活动管理<small class="label label-warning" style="display: none"
  21 + id="info_tab_span"><i class="fa fa-bell-o"></i></small>
  22 + </h1>
  23 +
  24 + <ol class="breadcrumb">
  25 + <li><a><i class="fa fa-dashboard"></i> 首页</a></li>
  26 + <li class="active">活动管理</li>
  27 + </ol>
  28 + </section>
  29 + <!-- Main content -->
  30 + <section class="content">
  31 + <div class="row">
  32 + <div class="col-xs-12">
  33 + <div class="box box-warning">
  34 + <div class="box-header with-border">
  35 + <h3 class="box-title"></h3>
  36 + <div class="box-tools">
  37 + <div class="input-group">
  38 + <form action="../search/1" method="get">
  39 + <div class="input-group">
  40 + <input type="text" name="search_user_id" id="search_user_id"
  41 + class="form-control input-sm" style="width: 150px;"
  42 + placeholder="用户id" />
  43 + <input type="text" name="search_title" id="search_title"
  44 + class="form-control input-sm" style="width: 150px;"
  45 + placeholder="活动名称" />
  46 + <button id="t_activity_search_btn" type="submit"
  47 + class="btn btn-sm btn-default">
  48 + <i class="fa fa-search"></i>搜索
  49 + </button>
  50 + </div>
  51 + </form>
  52 + </div>
  53 + </div>
  54 + </div>
  55 + <!-- /.box-header -->
  56 + <div class="box-body">
  57 + <table class="table table-bordered">
  58 + <tr>
  59 + <th>活动ID</th>
  60 + <th>用户ID</th>
  61 + <th>活动名称</th>
  62 + <th>开始时间</th>
  63 + <th>结束时间</th>
  64 + <th>状态</th>
  65 + <th>下线</th>
  66 + </tr>
  67 + <c:forEach var="item" items="${tLive.recordList}"varStatus="stat">
  68 + <tr>
  69 + <td>${item.id}</td>
  70 + <td>${item.t_user_id}</td>
  71 + <td>${item.title}</td>
  72 + <td><fmt:formatDate value="${item.start_time}"
  73 + pattern="yyyy-MM-dd HH:mm" /></td>
  74 + <td>${item.end_time}</td>
  75 + <td>
  76 + <c:if test="${item.t_status_id==0}">
  77 + <span class="badge bg-green">未开始</span>
  78 + </c:if> <c:if test="${item.t_status_id==2}">
  79 + <span class="badge bg-red">直播中</span>
  80 + </c:if> <c:if test="${item.t_status_id==1}">
  81 + <span class="badge">直播结束</span>
  82 + </c:if> <c:if test="${item.t_status_id==-2}">
  83 + <span class="badge">回放同步中</span>
  84 + </c:if>
  85 + </td>
  86 +
  87 + <td>
  88 + <button class="btn btn-danger btn-sm"
  89 + onclick="t_live_close('${item.id}','${item.live_url}');">
  90 + <i class="fa fa-close"></i>
  91 + </button>
  92 + </td>
  93 + </tr>
  94 + </c:forEach>
  95 + </table>
  96 + </div>
  97 + <!-- /.box-body -->
  98 + <div class="box-footer clearfix">
  99 + <center>
  100 + <tag:pager3 id="product_pager" pager="${tLive}" />
  101 + </center>
  102 + </div>
  103 + </div>
  104 + </div>
  105 + </div>
  106 + </div>
  107 + <%@ include file="/pages/common/bottom.jsp"%>
  108 + </div>
  109 + <%@ include file="/pages/common/js.jsp"%>
  110 +</body>
  111 +</html>
... ...
src/test/java/com/cnlive/test/HttpPostArgumentTest2.java deleted 100644 → 0
1   -package com.cnlive.test;
2   -
3   -import org.apache.commons.httpclient.NameValuePair;
4   -
5   -import com.cnlive.mz.live.common.HttpRequest;
6   -
7   -public class HttpPostArgumentTest2 {
8   -
9   - private static String user_access_key = "2b1621d5f4a54c4ebf1101cff027b636";
10   - private static String app_access_key = "df09616abbe04c72b5f5bbadf0e1edf6";
11   -
12   - public static void redirect() {
13   - NameValuePair[] param = { new NameValuePair("video_type", "2"),
14   - new NameValuePair("user_access_key", user_access_key),
15   - new NameValuePair("app_access_key", app_access_key) };
16   - String c = HttpRequest.postRequestWidthResult("http://upload02.vlog.cnlive.com/api/video/redirect", param);
17   - System.out.println(c);
18   - }
19   - public static void main(String[] args) {
20   - HttpPostArgumentTest2.redirect();
21   - }
22   -}
src/test/java/com/cnlive/test/Test.java deleted 100644 → 0
1   -package com.cnlive.test;
2   -
3   -import java.io.BufferedReader;
4   -import java.io.InputStreamReader;
5   -import java.net.URL;
6   -import java.net.URLConnection;
7   -import java.text.SimpleDateFormat;
8   -import java.util.Date;
9   -import java.util.Locale;
10   -
11   -import com.cnlive.mz.commons.net.HttpReq;
12   -
13   -public class Test {
14   -
15   - public static void main(String[] args) {
16   -// String mediaId="123";
17   -// String title="hha";
18   -// String sid="234";
19   -// //String url = "https://mobile.cnlive.com/CnliveMobile/hd/applyChatRoomId.action?mediaId="+mediaId+"&title="+title+"&sid=?"+sid;
20   -// String url = "https://mobile.cnlive.com/CnliveMobile/hd/applyChatRoomId.action";
21   -// //String chat_room_id = HttpReq.getRequestWidthResult(url);
22   -// System.out.println(sendGet(url));
23   - String live = "rtmp://cnlive01.rtmplive.ks-cdn.com/live/498122_a9fdb367c6054edc9d2035dc237d28aa";
24   - int index = live.lastIndexOf("/");
25   - System.out.println(index);
26   - String live_url = live.substring(index+1);
27   - System.out.println(live_url);
28   - }
29   -
30   - public static String toGMTString(Date date) {
31   - SimpleDateFormat df = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.UK);
32   - df.setTimeZone(new java.util.SimpleTimeZone(0, "GMT"));
33   - return df.format(date);
34   - }
35   - public static String sendGet(String url) {
36   - String result = "";
37   - BufferedReader in = null;
38   - try {
39   - URL realUrl = new URL(url);
40   - /*
41   - * http header 参数
42   - */
43   - String content_type = "application/json";
44   - String path = realUrl.getFile();
45   - String date = toGMTString(new Date());
46   - // 2.计算 HMAC-SHA1
47   - // 打开和URL之间的连接
48   - URLConnection connection = realUrl.openConnection();
49   - System.out.println(connection);
50   - // 设置通用的请求属性
51   - // 建立实际的连接
52   - // 定义 BufferedReader输入流来读取URL的响应
53   - in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
54   - String line;
55   - while ((line = in.readLine()) != null) {
56   - result += line;
57   - }
58   - } catch (Exception e) {
59   - System.out.println("发送GET请求出现异常!" + e);
60   - e.printStackTrace();
61   - }
62   - // 使用finally块来关闭输入流
63   - finally {
64   - try {
65   - if (in != null) {
66   - in.close();
67   - }
68   - } catch (Exception e) {
69   - e.printStackTrace();
70   - }
71   - }
72   - return result;
73   - }
74   -}