Java学习笔记 - 使用Java模拟生成直播弹幕日志案例

一. 日志格式需求

1.日志格式:
  • IP,UID,Time,URL,Referrer(访问来源),status code(状态码)
  • 其中URL有多种,弹幕的日志格式为
  • POST aa/pp HTTP 1.1
  • GET dm/send?line=哈哈哈哈哈 HTTP 1.1
2.示例
58.58.128.128 - - UID000161 [2019-12-01 20:07:41 +0800]"GET category/send?line=666,好厉害,sb HTTP 1.1" 搜狗 500
217.58.128.53 - - UID000731 [2019-12-01 20:07:41 +0800]"GET other/send?line=好厉害,666,666 HTTP 1.1" 360 500
94.53.58.247 - - UID000395 [2019-12-01 20:07:41 +0800]"GET dm/send?line=废物,nb HTTP 1.1" 火狐 200
29.127.29.230 - - UID000127 [2019-12-01 20:07:41 +0800]"GET dm/send?line=666,666 HTTP 1.1" google 200
11.247.9.224 - - UID000501 [2019-12-01 20:07:41 +0800]"GET other/send?line=666,主播好厉害啊 HTTP 1.1" 360 200
247.53.235.127 - - UID000299 [2019-12-01 20:07:41 +0800]"GET category/send?line=666,废物 HTTP 1.1" google 200
53.58.229.58 - - UID000785 [2019-12-01 20:07:41 +0800]"POST other/666,666,666 HTTP 1.1" 360 200
127.36.11.29 - - UID000814 [2019-12-01 20:07:41 +0800]"POST category/666,666 HTTP 1.1" 腾讯 200

二. 代码

package com.wangt.create.log;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/**
 * @author 王天赐
 * @create 2019-12-01 17:13
 */
@SuppressWarnings("all")
public class CreateLogsUtils {

    /**
     * 99.28.32.255 - - U00093866 [2019-12-01 17:35:14 +0800] "POST other/2983.html HTTP/1.1" 谷歌 200
     * 需求 :
     * 日志格式:
     * IP,UID,Time,URL,Referrer(访问来源),status code(状态码)
     *
     * 其中URL有多种,弹幕的日志格式为
     * POST aa/pp HTTP 1.1
     * GET dm/send?line=哈哈哈哈哈 HTTP 1.1
     */

    // 用于存放ip数据源, 用于随机组成 ip
    private static int[] ips = new int[20];
    private static Random random = new Random();
    private static SimpleDateFormat simpleDateFormat = null;
    // 作为随机生成访问来源的源数据
    private static String[] referrers = new String[]{
            "google", "腾讯", "360", "搜狗", "火狐", "IE"
    };
    // 作为随机生成状态码的源数据
    private static String[] statusCode = new String[]{
            "200","200","200","200","404","500","200","200","200"
    };
    // 请求类型
    private static String[] requestType = new String[]{"POST", "GET"};
    // 请求方式
    private static String[] requestMehtod = new String[]{"other","dm","category"};
    // 用于生成随机弹幕
    private static String[] words = new String[]{
           "666" , "nb", "好厉害", "sb", "废物", "主播好厉害啊", "666","666","666","666","666"
    };

    static{
        // 随机生成 0 - 255 之间的数据,放入ip数据源中
        for (int i = 0; i < ips.length; i++) {
            ips[i] = randomCreateRangeInt(0,255);
        }

        // 创建时间格式化对象
        simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    }

    /**
     * 随机生成日志
     * @return 日志信息
     */
    public static String createLog(){
        String log = getIp() + " - - " + getUID() + " "
                + getTime() + getURL() + " " + getReferrer() + " " + getStatusCode();
        return log;
    }

    /**
     * 生成随机的弹幕
     * @return 随机的弹幕
     */
    public static String createBarrage(){

        StringBuilder sb = new StringBuilder();

        // 生成弹幕语料库
        for (int i = 0; i < randomCreateRangeInt(1, 5); i++) {
            sb.append(words[randomCreateRangeInt(0,words.length)]);
            sb.append(",");
        }
        // 删除最后多余的 , 号
        sb.deleteCharAt(sb.length() -1);
        return sb.toString();
    }

    /**
     * 随机生成指定范围的 int 类型的数据
     * @param start 数据开始范围
     * @param end 数据截止 生成的大小不包含 end
     * @apiNote 生成的数据范围 : [start, end - 1]
     * @return 生成的int类型的数据
     */
    public static int randomCreateRangeInt(int start, int end){
        return (int) (random.nextDouble() * (end - start)) + start;
    }

    /**
     * 在元素前面补0,补到指定长度
     * @param obj 源数据
     * @param length 最终填充的产股东
     * @return 填充的结果数据
     */
    public static String fillZero(Object obj, int length){
        String str = obj.toString();
        return fillElem("0", str, length);
    }

    /**
     * 填充指定位数的元素
     * @param elem 填充的元素
     * @param str 源字符串
     * @param length 最终字符串的长度
     * @return 填充指定位数以及元素的结果
     */
    public static String fillElem(String elem , String str, int length){
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length - str.length(); i++) {
            sb.append(elem);
        }
        sb.append(str);
        return sb.toString();
    }


    /**
     * 随机生成 ip
     * @return 返回随机生成的 ip地址
     */
    public static String getIp(){
        StringBuilder ip = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            ip.append(ips[randomCreateRangeInt(0,20)]);
            if(i < 3){
                ip.append(".");
            }
        }
        return ip.toString();
    }

    /**
     * 随机生成用户的 UID
     * @return 随机的生成用户的 UID
     */
    public static String getUID(){
        Integer id = randomCreateRangeInt(1, 1000);
        return "UID" + fillZero(id, 6);
    }

    /**
     * 返回指定格式当前时间
     * @return 当前时间
     */
    public static String getTime(){
        Date date = new Date();
        return "[" + simpleDateFormat.format(date) + " +0800" +"]";
    }

    public static String getURL(){

        // 随机获取请求类型
        String reqType = requestType[randomCreateRangeInt(0, requestType.length)];
        // 随机获取请求方式
        String reqMethod = requestMehtod[randomCreateRangeInt(0, requestMehtod.length)];
        // 随机生成弹幕
        String barrage = createBarrage();

        //POST aa/pp HTTP 1.1
        //GET dm/send?line=哈哈哈哈哈 HTTP 1.1
        StringBuilder url = new StringBuilder();
        // 根据请求类型生成不同的url
        switch (reqType){

            case "POST" :
                url.append("\"POST " + reqMethod + "/" + barrage + " HTTP 1.1\"");
                break;
            case "GET" :
                url.append("\"GET " + reqMethod + "/send?line=" + barrage + " HTTP 1.1\"");
                break;
        }
        return url.toString();
    }

    /**
     * 生成随机的访问来源
     * @return 随机的访问来源
     */
    public static String getReferrer(){
        return referrers[randomCreateRangeInt(0,referrers.length)];
    }

    /**
     * 生成随机的状态码
     * @return 随机的状态码
     */
    public static String getStatusCode(){
        return statusCode[randomCreateRangeInt(0,statusCode.length)];
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兀坐晴窗独饮茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值