精华内容
下载资源
问答
  • 在项目开发过程中,往往会区分出测试环境线上环境,这里记录一下在使用vue进行开发的时候通过不同的打包指令区分测试线上环境。 首先我们需要安装cross-env npm i --save-dev cross-env 然后修改package.json...

    在项目开发过程中,往往会区分出测试环境和线上环境,看到教程帖子后在这里记录一下在使用vue进行开发的时候通过不同的打包指令区分测试和线上环境。

    首先我们需要安装cross-env

    npm i --save-dev cross-env
    

    然后修改package.json文件

    "scripts": {
        "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
        "start": "npm run dev",
        "unit": "jest --config test/unit/jest.conf.js --coverage",
        "e2e": "node test/e2e/runner.js",
        "build": "node build/build.js",
        // 下面的test和prod是新添加的命令
        "test": "cross-env NODE_ENV=production env_config=test node build/build.js",
        "prod": "cross-env NODE_ENV=production env_config=prod node build/build.js"
      }
    

    test和prod就是对应的测试和正式环境

    然后在config文件夹下创建test.env.js和prod.env.js文件,代码如下

    test.env.js

    'use strict'
    module.exports = {
      NODE_ENV: '"testing"',
      EVN_CONFIG: '"test"',
      BASE_API: '"https://rel-xxxx.com"'  //测试环境api
    }
    

    prod.env.js

    'use strict'
    module.exports = {
      NODE_ENV: '"production"',
      EVN_CONFIG: '"prod"',
      BASE_API: '"https://xxxx.com"'	//正式环境api
    

    然后修改config里的index文件,把prod,test添加到build参数

     build: {
        prodEnv: require('./prod.env'),
        testEnv: require('./test.env'),
        // Template for index.html
        index: path.resolve(__dirname, '../dist/index.html'),
        ......
      }
    

    然后修改webpackage.prod.conf.js

    const env = config.build[process.env.env_config+'Env']
    

    最后修改build.js

    'use strict'
    require('./check-versions')()
    
    // process.env.NODE_ENV = 'production'
    
    const ora = require('ora')
    const rm = require('rimraf')
    const path = require('path')
    const chalk = require('chalk')
    const webpack = require('webpack')
    const config = require('../config')
    const webpackConfig = require('./webpack.prod.conf')
    
    // const spinner = ora('building for production...')
    var spinner = ora('building for ' + process.env.NODE_ENV + ' of ' + process.env.env_config + ' mode...')
    spinner.start()
    ......
    

    到这里就已经全部配置完成了,比如我项目中使用axios来进行数据请求,在创建axios实例的时候配置

    // 创建 axios 实例
    const service = axios.create({
      baseURL: process.env.BASE_API, // api 的 base_url
      timeout: 40000 // 请求超时时间
    })
    

    执行npm run test ==> 测试环境
    执行npm run prod ==> 生产环境

    参考博文:https://www.cnblogs.com/woshidouzia/p/9345706.html

    展开全文
  • 介绍 ...因为不同的客户端代表着不同的用户,做到了获取不同客户端的userId那么自然就把不同的客户端区分开来了。经过查找资料试验,我找到了两种可行获取客户端userId的方法。一种是通过在Server取H

    介绍

        在使用websocket来制作多人即时聊天工具的时候,难免会遇到一个问题,如何区分不同的客户端。想要解决这个问题就等于是要解决这样一个问题:如何把当前登录用户的userId传给服务端呢?因为不同的客户端代表着不同的用户,做到了获取不同客户端的userId那么自然就把不同的客户端区分开来了。经过查找资料和试验,我找到了两种可行获取客户端userId的方法。一种是通过在Server取HttpSession中的值获取当前用户,一种是直接在客户端建立连接时附带上用户的值。

    开发环境和工具

        MyEclipse,Tomcat8.0
        WebSocket

    获取HttpSession值

        当我们在完成用户登录的功能时,用户登录成功,则将当前用户放入HttpSession中,这是一种很常见的做法,这一部分代码如下(框架是SpringMVC,不详细介绍,具体代码请以自己所用框架为准):

    if(Objects.equals(userDetail.getUserDetailPassword(), userPassword)){
    
    //如果当前用户登录成功,则将user对象放入httpSession的currentUser
                    httpSession.setAttribute("currentUser",user);
                    resoult = "success";
                }

        那么接下来问题的关键就来了,我们怎么在Server中获取在这里放入HttpSession中的User对象呢,直接获取肯定是不行的,不卖关子,直接放代码。
        注意,结构如图:

    1

        新建一个GetHttpSessionConfigurator类,内容如下:

    import javax.servlet.http.HttpSession;
    import javax.websocket.HandshakeResponse;
    import javax.websocket.server.HandshakeRequest;
    import javax.websocket.server.ServerEndpointConfig;
    import javax.websocket.server.ServerEndpointConfig.Configurator;
    
    public class GetHttpSessionConfigurator extends Configurator{
        @Override
        public void modifyHandshake(ServerEndpointConfig sec,HandshakeRequest request, HandshakeResponse response) {
            HttpSession httpSession=(HttpSession) request.getHttpSession();
            sec.getUserProperties().put(HttpSession.class.getName(),httpSession);
        }
    }

        然后在Server里面注解的地方加上一句:

    @ServerEndpoint(value="/server/",configurator=GetHttpSessionConfigurator.class)

        此时,我们就已经可以用

    @OnOpen
            public void onOpen(Session session, EndpointConfig config){
                HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
                }

        来获取httpSession对象了,然后直接取出currentUser存储的用户对象就可以了。

        但是,在这里我产生了一个问题:原则上来讲我在server获取的httpsession中取出来的用户对象就是现在正和服务端建立连接的对象,因为这种情况的操作肯定是先登录,然后直接建立连接,可是在实际中多用户同时登录时就不一定是这样子了。因为登录是客户端发起的操作,建立连接也是客户端发起的操作,且不说在客户端这两个操作是否是紧密相连,就算是紧密相连,从服务器验证成功(此时已经放入currentUser对象)返回登录结果给客户端到客户端向服务端发起连接这中间因为网络原因也是会消耗一定时间的。那么这时候一件尴尬的事情就发生了:此时,另一个用户也在登录,并且在之前用户两个操作期间完成了登录验证操作,那么第一个用户连接建立之后取出的use对象就不是这个用户的而是第二个用户的,这就乱套了。这种方法相当于是 ,用户A先对服务器说,记住了,我叫A,然后过了一会儿来说,我要建立连接,我是刚刚告诉你名字那个人。那如果B在A离开那会儿也告诉了服务器我叫B,那么服务器就会把A当成B了。
        当前,上面我所说的我没办法去验证,如果我对HttpSession理解错误那就另当别论了。(应该没理解错吧)如果理解有误还请大神指正。
        所以,感觉上来讲还是第二种方法靠谱一点。

    @PathParam获取用户对象

        这种方法是在建立连接时把userId放在建立连接的申请之中,这样的话就不会乱掉了:因为用户A登录成功之后我就把用户A的user对象传回去了,然后用户A拿着自己的userId来对客户端说我要建立连接我是A,服务端自然不会搞错。实现方法如下:
        服务端注解地方如下:

    @ServerEndpoint(value="/server/{userId}")

        方法参数如下:

    @OnOpen
            public void onOpen(@PathParam("userId")String userId,Session session)

        服务端在建立连接请求时路径如下(cp是jsp中的:)

    <c:set var="cp" value="${pageContext.request.contextPath}" />

        currentUser就是我们之前登录成功时放入httpSession的值,这个值即便别的用户登录也不会被刷新因为它是被保存在自己的浏览器之中的。

    ws = "ws://localhost:8080" + "${cp}" + "/server"+"/${currentUser.userId}";

        这样的话,服务端就获取到了当前建立连接的用户了。

    区分不同客户端

        能够获取不同用户userId之后,我们就可以在服务端进行如下操作来区分用户了,具体见注释。(为了突出要点,代码做了精简,仅仅用于示范区分不同的用户)

        public class Server {
         //存放每个客户端对应的Server对象,可以考虑使用Map来代替,key作为用户标识
         private static CopyOnWriteArraySet<Server> server = new CopyOnWriteArraySet<Server>();
         //表示与某个用户的连接会话,通过它给客户端发送数据
         @SuppressWarnings("unused")
         private Session session;
         //用户id
         private String userId;
         //用户id和websocket的session绑定的路由表
         @SuppressWarnings("rawtypes")
         private static Map routeTable = new HashMap<>();
         /**
             * 连接建立成功调用的方法
             * @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
             */
            @SuppressWarnings("unchecked")
            @OnOpen
            public void onOpen(@PathParam("userId")String userIds,Session session){
                this.session = session;
                //获取当前登录用户的id
                this.userId=userIds;
                //将用户id和session绑定到路由表
                //绑定之后就可以在其它地方根据id来获取session,这时两个用户私聊就可以实现了
                routeTable.put(userId, session);
            }
            //其它部分代码就不放了

        大概就是这样子了,这是我查找了很多资料自己也做过试验的结果,希望能够帮助到大家。
        好好学习,天天向上,加油!

    代码

        现在回头看一看,发现博客讲的不是很清楚,实在是抱歉了,此处把我项目的源码放上来,希望对各位有所帮助。
        Github:https://github.com/IcedSoul/WithMe
        项目本身比较大,包含1.0和2.0版本,它们使用的WebScoket版本不一样,1.0使用的是JavaEE7.0带的WebSocket(JSR356),只支持Web端聊天,2.0使用的是Github上的一个开源项目Java-WebScoket,同时支持Web端和Android端。查看代码的时候注意留意一下你所使用的WebSocket版本,然后去查看对应的代码。

    展开全文
  • 本文大家讲一下视频流媒体服务器中RTMPRTS的P区别什么? 大家都知道我们研发的不同视频流媒体服务器是接入不同协议的,国标流媒体服务器接入GB28181协议,而视频直播点播流媒体服务器就是接入RTSPRTMP

    当我们从网络摄像头上接收视频时,首先要了解协议(RTSP/RTMP/HTTP),然后是解码格式(MKV,RMVB),之后才是将视频(H264)和音频(AAC)格式数据分别解码为图像(RGB/YUV)和声音(PCM),再根据时间戳同步到流媒体平台(比如视频直播点播平台EasyDSS)播放。本文和大家讲一下视频流媒体服务器中RTMP和RTSP区别是什么?

    RTMP.png

    大家都知道我们研发的不同视频流媒体服务器是接入不同协议的,国标流媒体服务器接入GB28181协议,而视频直播点播流媒体服务器就是接入RTSP和RTMP协议的。

    RTSP+RTP主要用于IPTV,原因是传输数据使用的是UDP,在网络环境比较稳定的情况下,传输效率是比较高的。我们EasyNVR和国标流媒体服务器就能够使用UDP进行视频数据的传输。

    RTMP主要用于互联网音视频传输,它使用的是TCP传输,因为互联网环境相对较差,采用RTMP保证了视频的传输质量,但是其传输延迟相对较高,传输效率相对较低。我们视频直播点播平台EasyDSS就是采用TCP进行传输,如果在线需要观看高质量的视频监控,推荐还是使用EasyDSS视频直播点播平台。

    EasyDSS.png

    基于我们的视频流媒体服务平台,不管是使用RTSP还是RTMP协议,都能够在PC端直接观看视频,用户只需要打开网页,就可以直接收看流媒体,无需安装插件,十分方便。

    直播服务普遍采用了RTMP作为流媒体协议,FLV作为封装格式,H.264作为视频编码格式,AAC作为音频编码格式。FLV是RTMP使用的封装格式,H.264是当今实际应用中编码效率最高的视频编码标准,AAC则是当今实际应用中编码效率最高的音频编码标准。

    librtmp是RTMP协议的实现,可以使用librtmp来实现协议的解析和数据的收发。直播服务器可以基于nginx+rtmp实现;直播客户端方面采用librtmp负责推流,FFmpeg负责编码;收看客户端采用VLC即可,因为VLC本身就可以解析RTMP流,又可以解析编码后的视频数据。

    DSS3.png

    展开全文
  • 通过Spring.profiles.adtive来区分不同的配置文件 每一个配置文件有不同的name值 通过@Value注解注入配置文件的值 通过controller访问 通过不同的指定获取不同的name值 over ...

    建3个不同环境的配置文件

    通过Spring.profiles.adtive来区分不同的配置文件

    每一个配置文件有不同的name值

    通过@Value注解注入配置文件的值

    通过controller访问

    通过不同的指定获取不同的name值

    over

    展开全文
  • 办法很多: 1.注解: @Profiles()+@ActiveProfiles() @profile注解是spring提供的一个用来标明当前运行环境的注解,@ActiveProfiles用来表示使用哪种环境。当修改@ActiveProfile中的值时,所调用的内容也会随之...
  • react区分不同生产环境

    千次阅读 2019-11-29 11:34:27
    传统的方法就是通过process.env.NODE_ENV这个参数来区分当前的生产环境,但是我在实际使用的时候却发现,不管是线上还是st还是dev环境,都是给我返回的线上那条url。 后来改用域名来判断当前生产环境,这个要比...
  • 以下是原文 为了区分不同应用进程间的网络通信连接,主要3个参数:通信的目的IP地址、使用的传输层协议(TCP 或 UDP)使用的端口号。 Socket的原意是“ 教程 云栖大会 Mysql 备案 文档 域名 whois查询 ...
  • 本文讲述了关系数据库、JavaHibernate区分不同对象的方法。关系数据库按主键区分不同记录。Java语言按内存地址区别不同的对象。而Hibernate用对象标识符(OID)来区分不同对象。 1.关系数据库按主键区分不同记录...
  • 舵机信号线怎么区分有什么

    千次阅读 多人点赞 2018-07-26 18:34:54
    1.3 与直流电机区别 2. 舵机信号线 2.1 区分舵机信号线 2.2 舵机信号线的作用 3. 舵机的规格选型 3.1 规格 4. 舵机编程 舵机(Servo) 1. 舵机构造 1.1 组成 &amp;nbsp;&amp;nbsp;&...
  • 如果一个driver需要兼容两套设定,可以通过acpi_device_id 来区分 static const struct acpi_device_id hns_enet_acpi_match[] = {  { "HISI00C1", 0 }, ...这样在driver中接可以根据不同的device_id来区分不同
  • 什么不能根据返回类型区分重载?

    万次阅读 多人点赞 2017-04-24 09:36:10
    重载(过载)重写(覆盖)的区别重载的方法能否根据返回类型进行区分。?答:方法的重载重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名...
  • qmake判断不同平台并区分设置

    千次阅读 2018-04-13 16:49:07
    对于需要在windows,macx以及linux下发布的程序来说,每个平台都细微的差别;也许在windows下就需要引用某个库,但是在maclinux下就不需要。 在不同平台配置各自的pro工程文件自然就是不必要的,QMake本身就...
  • 如果是不同IP,这些映射表中的条目是否时效?如果不是,即用同一个外网IP,那返回包是如何转发到内网中各个主机上的?     答:NAT只是对地址进行转换。对端不需要支持NAT. 如果是家用路由器共享的话 比如你...
  • 重载覆盖有什么区别

    千次阅读 2019-04-18 10:21:56
    重载覆盖有什么区别? 重载覆盖都是java多态性的不同表现。其中重载是一个类中多态的一种表现,指的是一个类中定义了多个同名的方法,他们要么参数类型不一样,要么参数的各数不一样,或者不同的参数顺序,从而...
  • TCP服务器如何区分不同的用户

    千次阅读 2017-12-28 00:38:42
    CS架构:使用SOCKET(一般是一个整数),当服务器侦听到连接请求的时候,accept会返回一个SOCKET(用于识别不同的连接,可以理解成,SOCKET是区分不同连接的ID)。当服务器listen的时候,需要传入某个SOCKET作为listen...
  • 前言--我们可能会经常用到typeof去判断某一个变量的类型。 typeof一般测试基本类型(Undefined、Null、Boolean、...typeof对于区分数组对象是没有用的。 方法一:通过ES6中的Array.isArray来识别 Array.isAr...
  • Node.js Websocket 区分不同的用户

    千次阅读 2017-10-26 11:55:16
    Websocket 区分不同的用户 实现ws://serverIP:port/:param1/:param2 。通过param1,param2来管理不同的ws回话,以便实现群发指定用户的消息推送   1 2 npm install ws ...
  • Android通过build.gradle配置productFlavors区分加载若干套不同代码资源 Android在编译apk时候,时候需要根据不同环境启用或关闭相应的代码资源文件。比如,工程代码中一个Java写的Config文件,该文件在编译...
  • 区分什么是架构、框架、模式平台,一直都感觉这几个词过于抽象模糊,今天大家来说说到底什么是架构、框架、模式平台? 收集了的一些来自网上各自的定义和区分如下: 设计模式 模式:分为代码模式、设计模式...
  • 区分 #{} ${}的不同应用场景

    千次阅读 2016-10-20 17:32:30
    1)#{} 会生成预编译SQL,会正确的处理数据的类型,而${}仅仅是文本替换。 对于SQL: select * from student where xCode = 'S123456'; 如果使用#{} 那么生成的SQL为: select * from student where xCode = ?...
  • CMAKE 实现自动区分不同版本库

    千次阅读 2018-06-10 01:50:07
    此时需要考虑库的版本问题,一方面针对不同的编译器Release、Debug版本灵活选择不同的第三方库,另一方面生成不同版本的库,并能被其他项目灵活引用。CMAKE此时体现其重要作用。 这里记录并分析开源OCR项目...
  • 区分多态重载

    万次阅读 2017-03-22 21:32:05
    那么两者有什么区别呢?   重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的...
  • 看过vuewebpack api的同学都知道,使用npm run dev可以运行开发环境的代码,使用npm run build就是打包生产环境的代码。但是如果我还有测试环境预发布环境,运行npm run build命令只能在生成环境也就是线上环境...
  • 目前市场上,对二维动画三维动画的需求越来越多,那么这两种动画在表现形式有什么不同,我们又该如何区分呢?下面就来了解一下吧。 首先,我们先了解一下二维动画 二维动画是根据某个场景的人和物的画面绘制,然后...
  • 怎么区分有符号数无符号数

    千次阅读 2016-06-26 13:18:59
    我还是搞不清指令本身是如何区分有符号数无符号数!(问题汇总) 论坛的一个CSDN提问,对各方面的回答进行了汇总,答案还算比较清楚的。   一般好像是专门的符号数指令无符号数指令 比如 无符号除...
  • 区分生产与开发环境 我们需要对webpack.config.js分成两个文件,一个用于开发,一个用于生产 如何区分 新建三个文件 项目根目录 | --------webpack.base.js //基本配置 公共配置 (原先我们写的webpack.config...
  • fMRI与MRI区别+名词解释+MRI中T1T2的含义与区分

    千次阅读 多人点赞 2019-09-25 16:22:10
    fMRI与MRI区别 磁共振成像(MRI)提供人体内部结构的图片,而功能性磁共振成像(fMRI)评估代谢过程。MRI可以在身体的任何地方使用,而fMRI的研究则集中在大脑上,在大脑中可以显示活动水平非常细微变化的成像尤为...
  • 8259A是如何区分不同控制字的

    千次阅读 2013-04-06 10:18:21
    •8259A内部7个寄存器,分为两组:初始化命令寄存器组操作命令寄存器组。初始化命令寄存器组包括4个寄存器:ICW1~ICW4对应的寄存器。操作命 令寄存器组包括3个寄存器:OCW1~OCW3对应的寄存器。  •由于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 401,630
精华内容 160,652
关键字:

区分和区别有什么不同