精华内容
下载资源
问答
  • 客户端的创建和关闭2.1 创建2.2 关闭普通客户端2.3 Lua脚本的伪客户端2.4 AOF文件的伪客户端 1. 概括 Redis服务器是一对多服务器程序,一个服务器可以与多个客户端建立网络连接 Redis的文件事件是由I/O多路复用...

    1. 概括

    • Redis服务器是一对多服务器程序,一个服务器可以与多个客户端建立网络连接
    • Redis的文件事件是由I/O多路复用技术实现的,Redis服务程序使用单线程单进程的方式处理命令请求,与多个客户端进行网络通信
    • 服务器会为相连接的客户端建立redisClient结构,来记录客户端的状态信息等。

    redisClient结构包含:

    • 客户端的套接字描述
    • 客户端的名字
    • 客户端的标志值
    • 指向客户端正在使用的数据库的指针,以及该数据库的号码
    • 客户端的输入和输出缓冲区
    • 客户端的复制状态信息
    • 客户端的身份验证等
    • 多个redisClient是以链表的形式存在服务器中的,redisServer中的clients指针指向这个链表

    2 客户端属性

    默认情况下,连接到服务器的客户端是没有名字的指向,NULL指针,可自己设置。

    2.1 套接字描述符

    客户端状态的 fd 属性记录了客户端正在使用的套接字描述符:

    typedef struct redisClient {
        // ...
        int fd;
        // ...
    } redisClient;
    
    • 伪客户端(fake client)的 fd 属性的值为 -1 : 伪客户端处理的命令请求来源于 AOF 文件或者 Lua 脚本, 而不是网络, 所以这种客户端不需要套接字连接, 自然也不需要记录套接字描述符。 目前 Redis 服务器会在两个地方用到伪客户端, 一个用于载入 AOF 文件并还原数据库状态, 而另一个则用于执行 Lua 脚本中包含的 Redis 命令。
    • 普通客户端的 fd 属性的值为大于 -1 的整数: 普通客户端使用套接字来与服务器进行通讯, 所以服务器会用 fd 属性来记录客户端套接字的描述符。 因为合法的套接字描述符不能是 -1 , 所以普通客户端的套接字描述符的值必然是大于 -1 的整数。

    2.2 标志

    客户端的标志属性 flags 记录了客户端的角色(role), 以及客户端目前所处的状态,可由多个二进制表示。

    typedef struct redisClient {
        // ...
        int flags;
        // ...
    } redisClient;
    

    记录客户端的角色:

    • 在主从服务器进行复制操作时, 主服务器会成为从服务器的客户端, 而从服务器也会成为主服务器的客户端。 REDIS_MASTER 标志表示客户端代表的是一个主服务器, REDIS_SLAVE 标志表示客户端代表的是一个从服务器。
    • REDIS_PRE_PSYNC 标志表示客户端代表的是一个版本低于 Redis 2.8 的从服务器, 主服务器不能使用 PSYNC 命令与这个从服务器进行同步。 这个标志只能在 REDIS_SLAVE 标志处于打开状态时使用。
    • REDIS_LUA_CLIENT 标识表示客户端是专门用于处理 Lua 脚本里面包含的 Redis 命令的伪客户端。

    记录客户端目前所处的状态:

    • REDIS_UNIX_SOCKET 标志表示服务器使用 UNIX 套接字来连接客户端。
    • REDIS_MULTI 标志表示客户端正在执行事务。
    • REDIS_ASKING 标志表示客户端向集群节点(运行在集群模式下的服务器)发送了 ASKING 命令。
    • REDIS_CLOSE_ASAP 标志表示客户端的输出缓冲区大小超出了服务器允许的范围, 服务器会在下一次执行 serverCron 函数时关闭这个客户端, 以免服务器的稳定性受到这个客户端影响。 积存在输出缓冲区中的所有内容会直接被释放, 不会返回给客户端。

    2.3 输入缓冲区

    客户端状态的输入缓冲区用于保存客户端发送的命令请求(协议格式):

    typedef struct redisClient {
        // ...
        sds querybuf;
        // ...
    } redisClient;
    

    输入缓冲区的大小会根据输入内容动态地缩小或者扩大, 但它的最大大小不能超过 1 GB , 否则服务器将关闭这个客户端。

    2.4 命令与命令参数

    在服务器将客户端发送的命令请求保存到客户端状态的 querybuf 属性之后, 服务器将对命令请求的内容进行分析, 并将得出的命令参数以及命令参数的个数分别保存到客户端状态的 argv 属性和 argc 属性。

    typedef struct redisClient {
        // ...
        //数组,字符串对象
        robj **argv;
        //参数个数,'set key value'是3个参数
        int argc;
        // ...
    } redisClient;
    

    在这里插入图片描述

    2.5 命令实现

    当服务器从协议内容中分析并得出 argv 属性和 argc 属性的值之后, 服务器将根据项 argv[0] 的值, 在命令表(字典,键为SDS,值由实现函数、应有参数个数等信息)中查找命令所对应的命令实现函数。
    在这里插入图片描述

    针对命令表的查找操作不区分输入字母的大小写, 所以无论 argv[0] 是 “SET” 、 “set” 、或者 "SeT , 等等, 查找的结果都是相同的

    客户端状态的 cmd 指针指向目标 redisCommand 结构,如下图
    在这里插入图片描述

    2.6 输出缓冲区

    • 命令回复会被保存在客户端状态的输出缓冲区中
    • 每个客户端都有两个输出缓冲区可用, 一个缓冲区的大小是固定的, 另一个缓冲区的大小是可变的
    • 固定大小的缓冲区用于保存那些长度比较小的回复, 比如 OK 、简短的字符串值、整数值、错误回复,等等。
    • 可变大小的缓冲区用于保存那些长度比较大的回复, 比如一个非常长的字符串值, 一个由很多项组成的列表, 一个包含了很多元素的集合, 等等。

    客户端的固定大小缓冲区由 buf 和 bufpos 两个属性组成:

    typedef struct redisClient {
        // ...
        //REDIS_REPLY_CHUNK_BYTES,固定大小输出缓冲区默认16KB
        char buf[REDIS_REPLY_CHUNK_BYTES];
        
        //bufpos 属性则记录了 buf 数组目前已使用的字节数量
        int bufpos;
        
        //链表实现可变大小缓冲区
        list *reply;
        // ...
    } redisClient;
    

    在这里插入图片描述

    2.7 身份验证

    客户端状态的 authenticated 属性用于记录客户端是否通过了身份验证:

    typedef struct redisClient {
        // ...
        int authenticated;
        // ...
    } redisClient;
    
    • authenticated 的值为 0 , 那么表示客户端未通过身份验证;
    • authenticated 的值为 1 , 那么表示客户端已经通过了身份验证。

    authenticated 属性仅在服务器启用了身份验证功能时使用: 如果服务器没有启用身份验证功能的话, 那么即使 authenticated 属性的值为 0 (这是默认值), 服务器也不会拒绝执行客户端发送的命令请求。

    2.8 时间

    typedef struct redisClient {
    
        // ...
       //创建客户端的时间
        time_t ctime;
    
       //客户端与服务器最后一次进行互动的时间
        time_t lastinteraction;
    
        //空转(idle)时间,最后一次互动以来
        time_t obuf_soft_limit_reached_time;
    
        // ...
    
    } redisClient;
    

    2. 客户端的创建和关闭

    2.1 创建

    • 调用连接事件处理器
    • 创建客户端状态,并将这个新的客户端添加到clients链表末尾

    2.2 关闭普通客户端

    客户端被关闭的原因:

    • 客户端进程退出或者被杀死,客户端与服务器之间的网络连接被关闭
    • 客户端发送不符合协议格式的内容请求
    • 空转时间超过服务器设置的timeout配置,也有特殊情况
    • 客户端发送请求命令的大小超过输入缓冲区的限制大小(默认1G)
    • 返回内容超出限制

    两种模式来限制客户端输出缓冲区的大小

    1. 硬性限制:如果输出缓冲区大小超出硬性限制所设置的大小,客户端会被关闭
    2. 软性限制:超出软性限制,没有超出硬性限制,持续时间超过服务器设定时间,客户端被关闭。反之没有超过设定时间,不会被关闭。

    2.3 Lua脚本的伪客户端

    • 服务器初始化时创建负责执行Lua脚本中包含的redis命令的伪客户端,lua_client伪客户端在服务器运行的整个生命期中一直存在,直至服务器被关闭。

    2.4 AOF文件的伪客户端

    • 服务器在载入AOF文件时,会创建用于执行AOF文件中的redis命令的伪客户端,并在载入完成时,关闭这个伪客户端。
    展开全文
  • Netty即是服务端又是客户端,服务端和客户端相互对应。 具体功能细节是: 上游有一个服务,会主动发送消息给我中间件平台。中间件平台既有服务端也有客户端。通过下游客户端连接进来的客户端和中间件传下去的通道...

    Netty即是服务端又是客户端,服务端和客户端相互对应。

    具体功能细节是:

    上游有一个服务,会主动发送消息给我中间件平台。中间件平台既有服务端也有客户端。通过下游客户端连接进来的客户端和中间件传下去的通道id是一样的,实现互相对应的一种通道,保证知道传输的消息是走的同一条路。那么就要自己具备同时是一个服务端和一个客户端,下游客户端连接服务端。也就是达到一种透传的功能,中间件平台只充当消息转换的平台,不做任何转换。

    针对上面的功能细节实现代码思路是:将上游下发的数据和自己本身的连接数据以及下游客户端连接数据都使用全局map存储,在map中获取对应通道id和数据。

    第一步:监听是否有下游客户端连入,创建客户端连接

    public class NettyClientListener implements ApplicationRunner {
    
        @Autowired
        NettyClient NettyClient;
    
        @Override
        public void run(ApplicationArguments args) {
            log.info("Netty Client connection is starting ........................................");
            //自己本身作为客户端创建的一个客户端连接
            Channel channel = cGSNettyClient.newClient();
            CommonDataContext.putChannel(CommonDataContext.CGS_CHANNEL_KEY, channel);
            log.info("Netty Client channel id = {}", channel.id());
        }
    }

    第二步:初始化新的连接

    public class NettyClient {
    
        public void init() {
            client = new Bootstrap();
            EventLoopGroup group = new NioEventLoopGroup();
            //绑定客户端通道
            client.channel(NioSocketChannel.class);
            client.option(ChannelOption.SO_KEEPALIVE, true).option(ChannelOption.TCP_NODELAY, true);
            client.group(group);
            client.remoteAddress(host, port);
            //给NioSocketChannel初始化handler,处理读写事件
            client.handler(new ChannelInitializer<NioSocketChannel>() { // 通道是NioSocketChannel
                @Override
                protected void initChannel(NioSocketChannel ch) {
                    ch.pipeline().addLast(new IdleStateHandler(5, 5, 0));
                    ch.pipeline().addLast(new ByteArrayDecoder());
                    // 增加handler
                    ch.pipeline().addLast(new ClientHandler(applicationContext));
                }
            });
        }
    
        public Channel newClient() {
            try {
                if (client == null) {
                    init();
                }
                // 连接服务器
                ChannelFuture channelFuture = client.connect(host, port).sync();
                channelFuture.addListener(new ChannelFutureListener() {
                    @Override
                    public void operationComplete(ChannelFuture arg0) throws Exception {
                        if (channelFuture.isSuccess()) {
                            log.info("Netty client connection is successful ........................................");
                        } else {
                            log.info("Netty client connection is failed ........................................");
                            channelFuture.cause().printStackTrace();
                        }
                    }
                });
                return channelFuture.channel();
            } catch (Exception e) {
                log.error("Netty client connection is failed ........................................, because: {}", e.getMessage());
                return null;
            }
        }
    }

    第三部:通道连接,读写,销毁 

    public class YJServerHandler extends ChannelInboundHandlerAdapter {
    
    	/***
    	 * 通道下线(连接断开)
    	 * @param ctx
    	 */
    	@Override
    	public void channelInactive(ChannelHandlerContext ctx) {
    		Channel hardwareChannel = ctx.channel();
    		//客户端通道ID
    		String hardwareChannelId = ctx.channel().id().asLongText();
    		//中间件的客户端也需要关闭
    		Channel ccChannel = CommonDataContext.getChannel(hardwareChannelId);
    		//客户端ID查询对应的中间件通道ID
    		String ccChannelId = ccChannel.id().asLongText();
    
    		CommonDataContext.removeChannel(hardwareChannelId);
    		CommonDataContext.removeChannel(ccChannelId);
    
    		ccChannel.disconnect();
    		hardwareChannel.disconnect();
    	}
    
    	/**
    	 * 通道激活,客户端通道激活的同时,中间件也创建和激活一个客户端通道;
    	 * @param ctx
    	 */
    	@Override
    	public void channelActive(ChannelHandlerContext ctx) {
    		NettyClient NettyClient = SpringContextUtils.getBean(NettyClient.class);
    		Channel channel = ctx.channel();
    		//客户端通道激活的同时,(中间件)也创建一个客户端;
    		Channel cccClientChannel = ccNettyClient.newClient();
    		CommonDataContext.putChannel(channel.id().asLongText(), ccClientChannel);
    		CommonDataContext.putChannel(ccClientChannel.id().asLongText(), channel);
    		log.info("logictis channelActive ChannelMap = {}, 客户端地址及端口号:{}", CommonDataContext.getChannelMap(), ctx.channel().remoteAddress());
    	}
    
    	@Override
    	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    		//获取中间件的通道
    		Channel channel = CommonDataContext.getChannel(ctx.channel().id().asLongText());
    		//log.info("SocketHandler channel = {}", channel);
    		channel.writeAndFlush(msg);
    	}
    
    	@Override
    	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
    		cause.printStackTrace();
    		ctx.close();
    	}
    
    	@Override
    	public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
    		super.userEventTriggered(ctx, evt);
    		if (evt instanceof IdleStateEvent) {
    			IdleStateEvent event = (IdleStateEvent) evt;
    			if (IdleState.READER_IDLE.equals(event.state())) {
    				log.warn("暂时没有接收到数据");
    				// 可以选择重新连接
    			} else if (IdleState.WRITER_IDLE.equals(event.state())) {
    				log.warn("暂时没有发送数据");
    				// 发送心跳包
    				// ctx.writeAndFlush(MessageProto.Message.newBuilder().setType(1));
    			} else if (event.state().equals(IdleState.ALL_IDLE)) {
    				// 重新连接和
    				log.warn("暂时没有接收或发送数据");
    			}
    		}
    	}
    }
    

    第四部:监测 

    public class XYServerPipeline extends ChannelInitializer<SocketChannel> {
    
    	@Override
    	public void initChannel(SocketChannel ch) {
    		ChannelPipeline pipeline = ch.pipeline();
    
    		pipeline.addLast(new ByteArrayEncoder());
    		// 空闲状态处理器,检测通信Channel的读写状态是否超时,实现心跳检测
    		pipeline.addLast("idleStateHandler", new IdleStateHandler(180, 180, 180, TimeUnit.SECONDS));
    		pipeline.addLast(new XYServerHandler());
    	}
    }

     第五步:实现业务读取并下发到下游客户端

        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                //向客户端发送消息,并获取到消息结果,在返回给上游;
                Channel channel = CommonDataContext.getChannel(ctx.channel().id().asLongText());
                log.info("ClientHandler channel = {}", channel);
                channel.writeAndFlush(msg);
                return;
    }

     

    展开全文
  • 【比较】什么是“服务器端跳转”“客户端跳转”,二者有什么区别? 浏览器的页面跳转大家都很熟悉,页面跳转具体分为以下两种: 服务器端跳转 客户端跳转 那么,到底什么是“服务器跳转”和“客户端跳转”呢? 1、...

    【比较】什么是“服务器端跳转”“客户端跳转”,二者有什么区别?

    浏览器的页面跳转大家都很熟悉,页面跳转具体分为以下两种:

    • 服务器端跳转
    • 客户端跳转

    那么,到底什么是“服务器跳转”和“客户端跳转”呢?

    1、服务器跳转

    所谓服务器端跳转就是指地址栏内容不变(即客户端浏览器的地址栏不会显示跳转后地址的URL)。

    客户端请求到达以后,服务器发现当前资源给不出回应,要在服务器内部请求另一个资源的跳转,即服务器端跳转。所以,这种跳转与否客户端不知道(URL不变),属于一次request。

    2、客户端跳转

    所谓客户端跳转是指地址栏内容发生改变(客户端向服务器发请求偶,然后服务器再给客户端一个响应,然后客户端再根据服务器端给的响应中的URL再向服务器发送请求,所以是两次请求,因此地址栏改变了,显示的是最后一次请求地址)。

    客户端请求到达服务端,服务端返回一个 “去访问其他链接” 的回应,客户端依此回应,第二次去访问。所以,这种跳转是客户端根据回应地址又跳转了一次,第二次跳转后,已经出了request的属性范围。

    【总结】Java Web 中的4种属性范围(page、request、session、application)
    详细解释参考链接:【总结】Java Web 中的4种属性范围(page、request、session、application)

    3、Java中的常见服务器端跳转

    1. request.getRequestDispatcher(“success.jsp”).forward(request,response),它是只要执行到此语句之后则立刻进行跳转,可以传递request属性;
    2. < jsp:forward >,这种跳转属于无条件跳转,它只能在栈内转,而sendREdirect中则可以任意转,甚至可以输入baidu;
      注:无条件跳转后,此跳转语句后边的代码都不会被执行(比如关闭数据库一类的)

    4、Java中的常见客户端跳转

    1. response.sendRedirect(“fail.jsp”),所有页面执行完之后再进行跳转,不能传递request范围的属性,但是可以通过地址重写的方式向跳转页传递参数,因为该方法执行完之后就相当于一次http request的结束,这是服务器会向客户端发送302状态码和新的url,告诉客户端重新发送request请求到新的url,然后客户端照此执行,执行即新的请求响应流程开始,服务器再重新创建HttpServletRequest对象和HttpServletResponse对象,此时两个请求已经不在一个线程了,所以request和response对象都不是开始的那个了;
    2. response.setHeader(“refresh”,“2;URL=index.jsp”),2秒后跳转到其他页面;
    3. < a href=“http://www.baidu.com” >百度,超链接跳转也属于客户端跳转;
    4. 表单提交;

    注意:

    1. 如果现在一个页面中使用了JDBC,则应该在forward跳转之前关闭数据库链接,而使用respose则可以在任意的位置处关闭;
    2. 客户端跳转“/”代表服务器路径webapps,即服务器根路径,服务器端跳转“/”代表站点根路径,即应用程序根路径;
    3. 尽量使用response.sendRedirect(“fail.jsp”)而不去使用forward,因为当服务器崩溃了,那么sendRedirect则就会起很大的好处了。

    5、Servlet跳转

    1. redirect 方式
      response.sendRedirect("/a.jsp");
      页面的路径是相对路径。
      sendRedirect可以将页面跳转到任何页面,不局限于本web应用中,如:response.sendRedirect(http://www.ycul.com);
      跳转后浏览器地址栏变化。
      这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。

    2. forward方式
      request.getRequestDispatcher("/a.jsp").forward(request, response);

      getServletContext().getRequestDispatcher("/a.jsp").forward(request, response);
      页面的路径是相对路径。
      forward方式只能跳转到本web应用中的页面上。
      跳转后浏览器地址栏不会变化。
      使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute

    6、JSP跳转

    1. response.sendRedirect();
      和servlet的response.sendRedirect()方式一样。
      此语句前不允许有out.flush(),如果有,会有异常:
      java.lang.IllegalStateException: Can’t sendRedirect() after data has committed to the client.
      at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)…
      跳转后浏览器地址栏变化
      如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了;
      如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转

    2. response.setHeader(“Location”,"");
      此语句前不允许有out.flush(),如果有,页面不会跳转。
      跳转后浏览器地址栏变化
      此语句后面的语句执行完成后才会跳转.

    3. <jsp:forward page="" />
      此语句前不允许有out.flush(),如果有,会有异常:
      java.lang.IllegalStateException: forward() not allowed after buffer has committed.
      at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:134)
      at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101)
      at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836)
      跳转后浏览器地址栏不变,但是只能跳到当前主机下
      此语句后面的语句执行完成后才会跳转

    展开全文
  • tcp客户端

    2018-11-29 08:39:44
    tcp客户端,并不是像之前一个段子:一个顾客去饭馆吃饭,这个顾客要点菜,就问服务员咱们饭店有客户端么,然后这个服务员非常客气的说道:先生我们饭店不用客户端,我们直接送到您的餐桌上 如果,不学习网络的知识...

    tcp客户端,并不是像之前一个段子:一个顾客去饭馆吃饭,这个顾客要点菜,就问服务员咱们饭店有客户端么,然后这个服务员非常客气的说道:先生我们饭店不用客户端,我们直接送到您的餐桌上

    如果,不学习网络的知识是不是 说不定也会发生那样的笑话 ,哈哈

    所谓的服务器端:就是提供服务的一方,而客户端,就是需要被服务的一方

    tcp客户端构建流程

    tcp的客户端要比服务器端简单很多,如果说服务器端是需要自己买手机、插手机卡、设置铃声、等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多

    示例代码:

    #coding=utf-8
    from socket import *
    
    # 创建socket
    tcpClientSocket = socket(AF_INET, SOCK_STREAM)
    
    # 链接服务器
    serAddr = ('192.168.1.102', 7788)
    tcpClientSocket.connect(serAddr)
    
    # 提示用户输入数据
    sendData = raw_input("请输入要发送的数据:")
    
    tcpClientSocket.send(sendData)
    
    # 接收对方发送过来的数据,最大接收1024个字节
    recvData = tcpClientSocket.recv(1024)
    print '接收到的数据为:',recvData
    
    # 关闭套接字
    tcpClientSocket.close()
    

    运行流程:

    <1>tcp客户端

    <2>网络调试助手:

     

    展开全文
  • 如今的Windows客户端开发,已经被同行嘲笑为鸡肋,甚至有些人认识做Windows客户端就是一个笑柄。食之无味,弃之可惜。不可否认,PC端没落的很快。但是想说的是,任何一门技术都有存在的道理。微软就是所有Windows...
  • 软件测试之客户端(Client)测试

    千次阅读 多人点赞 2019-07-01 17:47:25
    Client测试也叫做客户端测试,他是测试安装在用户机器上的应用程序的各个功能是否可以正常运行 需要先在本机安装Client程序包,然后通过运行Client程序,进行各种数据的输入,保存等操作。 测试内容包括:安装测试、...
  • OpenSSH概念和基本用法——SSH 客户端

    千次阅读 2021-01-04 23:59:47
    由于在分布式数据库运维过程中进行脚本自动化必然会涉及SSH登录工具,故摘抄此篇文章以供学习之用。 SSH 是 Linux 系统的登录工具,现在广泛用于服务器登录和各种...SSH 是什么 历史上,网络主机之间的通信是不加密的,
  • 服务器关闭客户端连接操作

    千次阅读 2018-12-05 11:22:46
    玩家在登陆成功后,会将fd和NetCache保存起来,同时将fd设置在玩家自己的身上,那么在什么时机会关闭fd连接呢? 关闭连接操作如下 void NetHandler::doCloseConnection(int fd) { if (fd &gt; 0) { FD_CLR(fd...
  • HTTP 404错误你知道是什么意思

    千次阅读 2021-01-13 13:05:38
    那么404到底是什么意思,为什么会提示404错误呢? 通常在网站目标页面被更改或移除后,就会显示404错误页面。有时候客户端输入页面地址错误后,也会显示404错误页面。404是一个http错误代码,即请求的网页内容不存在...
  • 客户端架构

    千次阅读 2017-10-15 20:56:26
    客户端架构简介  客户端(Client)或称为用户端,是指与服务器相对应,为客户提供本地服务的程序。除了一些只在本地运行的应用程序之外,一般安装在普通的客户机上,需要与服务端互相配合运行。 架构,又名...
  • 客户端版本检测异常

    2020-12-20 16:00:28
    版本号:业务场景(如下):操作会计平台凭证生成时,发现生成凭证仍然是弹出窗口而不是打开页签,但是这个问题已经更新过补丁处理过了,怀疑是客户端文件未更新,尝试卸载客户端后重新安装客户端,安装客户端时检测出...
  • 客户端启动流程

    2020-02-08 23:23:18
    客户端启动 Demo 对于客户端的启动来说,和服务端的启动类似,依然需要线程模型、IO 模型,以及 IO 业务处理逻辑三大参数,下面,我们来看一下客户端启动的标准流程 public class NettyClient { public static void...
  • 1、客户端  echo客户端,在和服务器连接以后,客户端应该进入一个循环,反复从标准输入读取文本行,发送文本行给服务器,从服务器读取回送的行,并输出结果到标准输出。当fgets在标准输入上遇到EOF时,或者因为...
  • PC客户端测试

    千次阅读 2020-06-01 17:46:32
    PC客户端测试的要点主要有以下: 一级测试点 二级测试点 安装测试 首次安装(exe和msi格式的不同) 安装程序权限检查 软件安装包的描述和属性信息 静默安装和非静默安装测试 有UAC安装、无UAC...
  • mac关闭向日葵客户端自启动的方法

    千次阅读 2020-07-22 09:38:21
    向日葵客户端后,虽然给我带来了便利,但是也给我带来了个困扰,每次开机,向日葵的客户端都会自启动,去官网问了客服和搜索了很多帖子,方法都不试用,最后经过很长一段时间的摸索,发现了正确的关闭方式。...
  • 自从出现了电脑版的微信之后,很多用户都会在电脑中下载安装一个客户端,可就是电脑客户端...因为在微信中是自动设置了使用默认浏览器打开的,无法识别的时候自然就不能打开了,我们可以在微信中直接将这个功能关闭...
  • http客户端请求及服务端详解

    千次阅读 2018-04-06 14:12:00
    http客户端请求及服务端详解 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展。目前在WWW中...
  • 深入理解UDP 服务器与客户端

    千次阅读 2019-08-25 09:45:00
    而 TCP 则不同,TCP 服务器接受了客户端的连接后,既可以先向客户端发送数据,也可以等待客户端发送数据后再响应。 0x03 UDP 服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/usr/bin/env python3 # -*- coding: utf...
  • 原因:服务器重启造成客户端无法连接到DLP服务器。全部显示“脱机登录” 经检测错误原因: 一、5222(8443、8888)端口被EXCEL服务器占用。 二、域服务器重启后默认防火墙是全部开启。 1.192.168.0.200 DLP...
  • 在微服务里面,由服务端,客户端,注册中心三要素组成,以滴滴平台为例,这三要素的运行,最重要的就是注册中心,为什么呢,因为服务端,客户端,你可以少一个两个,并不会影响到整体滴滴平台和广大人民群众的出行,...
  • 设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的数据的发送和接收(S发给C,C发给S)。 服务端程序能响应单个或任意多个客户端连接...
  • RabbitMQ 客户端API使用

    千次阅读 2018-09-15 20:17:32
    目录 一、连接RabbitMQ服务器 二、使用交换器和队列 1.声明查找删除交换器 2. 声明查找删除队列 3. 队列绑定交换器和解绑 queueBind ...4.交换器和交换器绑定exchangeBind ...关闭连接 RabbitMQ Jav...
  • 为了成功安装客户端,建议用户在安装客户端之前先把防火墙和杀毒软件关闭,然后再安装客户端;在安装完客户端之后在启动防火墙和杀毒软件,并且根据提示将客户端驱动添加到防火墙和杀毒软件信任列表。2、有一些用户...
  • 服务器处理客户端的请求,将响应返回到客户端,并关闭客户端建立的连接。但是对许多Web应用而言,服务器往往需要记录特定客户端与服务器之间的一系列请求的特定信息。这一些列请求被称作会话,记录会话信息的技术...
  • 比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接。我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触发OnClose事件。我是...
  • 要解决的问题: 如何开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV...1.要注意,为了邮箱使用安全,默认会关闭POP3/IMAP/SMTP等服务。设置客户端登录前,需要先进邮箱把服务打开。下面演示下,126邮箱怎么开启IMAP服...
  • Flink客户端操作

    2021-01-26 23:30:38
    参考学习别人的Flink客户端操作内容。概要Flink 提供了丰富的客户端操作来提交任务和与任务进行交互,包括 Flink 命令行,Scala Shell,SQL Client,Restful API 和 Web。Flink 首先提供的最重要的是命令行,其次是 ...
  • 有些用户可能还不知道WAPI是什么意思,iphone7或者iOS10设备中,才有“启用WAPI”选项。下面装机之家分享一下关于iphone手机中WAPI的知识。WAPI是什么意思?我们先看WAPI 的全称为 Wireless LAN Authentication and ...
  • 客户端错误4xx

    2018-10-29 20:26:19
    4xx 系列状态码可以算是对用户来说相当熟悉的一类状态码,这个系列的状态码通常都会带一段描述信息来描述服务端在处理请求时出现了什么状况,用户能直观地看到服务端返回的信息,而不像 3xx 系列,浏览器会自动处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,978
精华内容 49,991
关键字:

关闭客户端是什么意思