精华内容
下载资源
问答
  • 服务端程序

    2016-12-08 17:23:03
    服务端程序 服务端运行的都是python模块,使用总线式通信,rabbitmq作为总线工具。redis作为内存数据库。 后台模块主要分三个部分: 数据接收模块 –httppub.py– 数据处理模块 –m_ctrlcenter.py、m_statuschanger...

    服务端程序

    服务端运行的都是python模块,使用总线式通信,rabbitmq作为总线工具。redis作为内存数据库。

    后台模块主要分三个部分:

    • 数据接收模块 –httppub.py–
    • 数据处理模块 –m_ctrlcenter.py、m_statuschanger.py–
    • 指令发送模块 –m_redispush.py–

    同时为了实时获取总线所有数据信息,写了一个总线数据获取模块 –m_echo.py–

    工作流程


    服务端程序的工作流程为下:

    HTTP接口获取数据 —–> 数据接收模块 —–> 数据处理模块 —–> 指令发送模块

    数据接收

    从HTTP接口获取到数据,通过调用httppub.py脚本,将数据封装后发送到总线上,发送目标模块为数据处理模块。

    #
    # httppub.py
    # 主要代码
    
    def Pub(message_):
      connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
      channel = connection.channel()
      channel.exchange_declare(exchange='topic_test', type='topic')
    
      channel.basic_publish(exchange='topic_test',
                    routing_key=method,
                    body=message_)
    
      connection.close()
    
    def Main(param_):
        #to do
      msg = Packer(param_)
      Pub(msg)
    
    def send(param_):
      Main(param_)
    

    数据处理

    数据处理脚本主要是m_ctrlcenter.py。此脚本首先订阅并获取到从httppub.py发送过来的数据,然后按照既定的逻辑进行数据分析,这里的数据分析逻辑完全可以按照自己项目需求来。

    在这个项目里面,这个脚本主要是转发消息。将不同属性的指令转发至不同模块。

    #
    # m_ctrlcenter.py
    # 主要代码
    
    
    
    def Pub(message_, method_):
        channel.basic_publish(exchange='topic_test',
                    routing_key=method_,
                    body=message_)
    
    def StartPush(msg):
      _params = {}
      _params["instructions"] = msg["params"]["message"]
      _params["method"] = "redispush"
      pubmsg = Packer(_params)
      #To do redis push
      Pub(pubmsg, _params["method"])
      return pubmsg
    
    def StartChange(msg):
      _params = {}
      _params["instructions"] = msg["params"]["message"]
      _params["method"] = "statuschanger"
      pubmsg = Packer(_params)
      #To do redis changer
      Pub(pubmsg, _params["method"])
      return pubmsg
    
    
    
    
    def Main(msg_):
      # To do
      if msg_["params"]["retcode"] == 0:
        if msg_["params"]["type"] == 1:
          return StartChange(msg_)
        elif msg_["params"]["type"] == 2:
          return StartPush(msg_)
    
      return Packer(msg_)
    
    
    def callback(ch, method, properties, body):
        # To do 
        #print(" [x] %r:%r" % (method.routing_key, body))
        message = Main(json.loads(body))
        Pub(message, "echo")
    

    m_ctrlcenter.py处理的指令分为两种,这个可以在“接口定义”文章中查阅 type字段定义。

    如果是推送操作,就把数据推给m_redispush.py模块,如果是写入操作,就把数据推给m_statuschanger.py模块。

    将指令解析后修改数据库:

    #
    # m_statuschanger.py
    # 主要代码
    
    def Pub(message_, method_):
        channel.basic_publish(exchange='topic_test',
                    routing_key=method_,
                    body=message_)
    
    def StartChange(instructions):
      #To do redis changer
      no = instructions[1]
      operation = instructions[2]
      r.set(table[no], operation)
    
    
    
    def Main(msg_):
      # To do
      _params = {}
      _params["retcode"] = -1
      _str = msg_["params"]["instructions"]
      instructions = _str.split("~")
      if instructions[0] == "S" and instructions[3] == "S":
        StartChange(instructions)
        _params["retcode"] = 0
      _params["operation"] = _str
      return Packer(_params)
    
    
    def callback(ch, method, properties, body):
        # To do 
        message = Main(json.loads(body))
        Pub(message, "echo")

    指令发送

    目前指令主要是存在redis队列里面,然后使用brpop进行取数据。树莓派可以直接获取这些指令。

    数据存储服务

    #
    # m_redispush.py
    # 主要代码
    
    def Pub(message_, method_):
        channel.basic_publish(exchange='topic_test',
                    routing_key=method_,
                    body=message_)
    
    def Main(msg_):
      # To do
      params_ = {}
      if msg_["method"] == "redispush":
        r.lpush(queue,msg_["params"]["instructions"])
        params_["pushresult"] = "true"
        params_["instructions"] = msg_["params"]["instructions"]
      return Packer(params_)
    
    
    def callback(ch, method, properties, body):
        # To do 
        #print(" [x] %r:%r" % (method.routing_key, body))
        message = Main(json.loads(body))
        Pub(message, "echo")
    展开全文
  • TCP通讯 服务端程序

    2018-05-17 14:22:58
    TCP通讯 服务端程序 TCP通讯 服务端程序 TCP通讯 服务端程序
  • Subversion服务端程序

    2018-10-05 12:45:46
    Subversion服务端程序,用于安装SVN服务端。详情请见:https://blog.csdn.net/ScongHW/article/details/82943163
  • java的服务端程序(多线程)和客户端程序 Demo
  • git服务端程序比较

    2020-04-10 09:53:41
    git服务端程序比较引子功能权限控制粒度用户管理方式软件依赖安装难易程度使用难易程度资源消耗中文支持总结 引子 最近试用了几个git服务端程序,把当前试用的感受和比较列举一下。 当然,理论上说,git是不需要...

    引子

    最近试用了几个git服务端程序,把当前试用的感受和比较列举一下。
    当然,理论上说,git是不需要服务端程序的,安装完git之后,可以使用ssh来登录,使用主机的用户管理来做用户权限管理,但是对于windows用户似乎有点难,操作有点复杂。所以才有了一众在git之上开发的服务端程序。这些程序各有各的优点,可以根据自身的需要选择。
    目前试用了gitlab,gerrit,gogs,还有一个gitolite没试用,但是也从文档中0了解了一些,也一并列举。
    下面从功能,权限控制粒度,用户管理方式,软件依赖,安装难易程序,使用难易程度,资源消耗等方面进行比较

    功能

    总体来说,gitlab是功能最全的,包含了用户管理,代码管理,issue管理,持续集成等功能,使用pull request的方式,可以做到代码审查的功能。
    gerrit配合openLDAP可以做到用户管理,它的代码审查功能是它的亮点。
    gogs可以认为是简化版的gitlab,也包含了用户管理,代码管理,issue管理,也可以使用pull request的方式做到代码审查。
    gitolite从文档中看,似乎只做到了用户管理。

    权限控制粒度

    gitlab和gogs可以以库为单位来设置权限,可以设置为只读和可读写。
    gerrit也可以以库为单位进行权限设置。但是可以对用户设置更多的权限,可以赋给审核权限,提交权限,直接push权限等等。
    这三个软件是否可以以分支为单位进行权限控制还不太了解。
    gitolite从文档看,可以做到分支级的权限控制。

    用户管理方式

    gitlab和gogs都可以直接使用web端来直接创建用户,非常方便。
    gerrit使用的是openLDAP来管理用户,也可以配合phpldapadmin来使用web端来管理用户。
    gitolite从文档看,是通过修改文件来进行管理的

    软件依赖

    gitlab和gogs都依赖于数据库,gogs支持sqllite,所以用起来也不是很复杂。
    gerrit本身只关注代码审查,需要依赖openLDAP来管理用户。
    gerrit和gitolite都是通过配置文件来管理配置,可以直接使用git来管理,做到了自举。

    安装难易程度

    从使用docker安装来说,gerrit安装时由于依赖于openLDAP,是遇到坑最多的。但是最终安装完成后,回头看,有好多问题是由于使用了win7安装导致。
    gitlab使用了docker安装和在ubuntu虚拟机下安装,都还算比较顺序。除了内存分配了2G,导致502错误之外。
    gogs是安装最简单的。虽然只试用了docker安装,但是从文档中看到安装方式还是挺多的。

    使用难易程度

    gitlab和gogs使用起来对于有github基础的人来说,是挺简单的,与github很像。其中gogs由于提供的功能也没那么多,摸索起来还是挺快的。
    gerrit的摸索还是费了一些时间的,特别是change的处理,还有强大的权限管理功能。
    gitolite从文档看,需要配置文件,有点吓到了。

    资源消耗

    gitlab的资源消耗是值得注意的,2G的内存不够,需要分配至少3G的内存,查看监视,也是使用了2.16G的内存。
    gogs和gerrit用起来没有发现会影响主机操作。所以可能资源消耗是比较少的。
    gitolite从文档看,消耗也是很少的。

    中文支持

    gitlab可以设置为中文,gogs天然支持中文
    gerrit和gitolite不支持中文。

    总结

    总结一下各个软件的亮点和缺点

    软件名 亮点 缺点
    gitlab 功能强大,可以管理大型项目 资源消耗大
    gogs 中文支持好,使用简单
    gerrit 强大的代码审查功能 安装配置比较复杂
    gitolite 可以做到分支级别的权限管理,资源消耗低 配置使用文件完成
    展开全文
  • Android客户端与pc服务端程序

    热门讨论 2012-06-23 11:09:52
    Android客户端与pc服务端程序,访问pc服务端的mysql,Access,显示在android客户端!
  • Telnet服务端程序

    热门讨论 2012-01-11 14:37:24
    自己写了一个Telnet服务端程序,效仿Windows的Telnet服务,远程进行一些Dos命令操作。可以在一台机器上运行,telnet 127.0.0.1 6000 账号:ddd 密码:123
  • 简单的客户端服务端程序,客户端发出连接,服务端接受连接,服务端接受客户端传送的数据。
  • http通信服务端程序,用于测试向服务端提交用户名、密码 其中,用户名:admin 密码:123
  • 网络编程之服务端程序开发1. 开发 TCP 服务端程序开发步骤回顾2. socket 类的介绍3. TCP 服务端程序开发示例代码 1. 开发 TCP 服务端程序开发步骤回顾 创建服务端端套接字对象 绑定端口号 设置监听 等待接受客户端...


    1. 开发 TCP 服务端程序开发步骤回顾

    1. 创建服务端端套接字对象
    2. 绑定端口号
    3. 设置监听
    4. 等待接受客户端的连接请求
    5. 接收数据
    6. 发送数据
    7. 关闭套接字

    2. socket 类的介绍

    导入 socket 模块
    import socket

    创建服务端 socket 对象
    socket.socket(AddressFamily, Type)

    参数说明:

    • AddressFamily 表示IP地址类型, 分为TPv4和IPv6
    • Type 表示传输协议类型

    方法说明:

    • bind((host, port)) 表示绑定端口号, host 是 ip 地址,port 是端口号,ip 地址一般不指定,表示本机的任何一个ip地址都可以。
    • listen (backlog) 表示设置监听,backlog参数表示最大等待建立连接的个数。
    • accept() 表示等待接受客户端的连接请求
    • send(data) 表示发送数据,data 是二进制数据
    • recv(buffersize) 表示接收数据, buffersize 是每次接收数据的长度

    3. TCP 服务端程序开发示例代码

    import socket
    
    if __name__ == '__main__':
        # 创建tcp服务端套接字
        tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 设置端口号复用,让程序退出端口号立即释放
        tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 
        # 给程序绑定端口号
        tcp_server_socket.bind(("", 8989))
        # 设置监听
        # 128:最大等待建立连接的个数, 提示: 目前是单任务的服务端,同一时刻只能服务与一个客户端,后续使用多任务能够让服务端同时服务与多个客户端,
        # 不需要让客户端进行等待建立连接
        # listen后的这个套接字只负责接收客户端连接请求,不能收发消息,收发消息使用返回的这个新套接字来完成
        tcp_server_socket.listen(128)
        # 等待客户端建立连接的请求, 只有客户端和服务端建立连接成功代码才会解阻塞,代码才能继续往下执行
        # 1. 专门和客户端通信的套接字: service_client_socket
        # 2. 客户端的ip地址和端口号: ip_port
        service_client_socket, ip_port = tcp_server_socket.accept()
        # 代码执行到此说明连接建立成功
        print("客户端的ip地址和端口号:", ip_port)
        # 接收客户端发送的数据, 这次接收数据的最大字节数是1024
        recv_data = service_client_socket.recv(1024)
        # 获取数据的长度
        recv_data_length = len(recv_data)
        print("接收数据的长度为:", recv_data_length)
        # 对二进制数据进行解码
        recv_content = recv_data.decode("gbk")
        print("接收客户端的数据为:", recv_content)
        # 准备发送的数据
        send_data = "ok, 问题正在处理中...".encode("gbk")
        # 发送数据给客户端
        service_client_socket.send(send_data)
        # 关闭服务与客户端的套接字, 终止和客户端通信的服务
        service_client_socket.close()
        # 关闭服务端的套接字, 终止和客户端提供建立连接请求的服务
        tcp_server_socket.close()
    

    执行结果:

    客户端的ip地址和端口号: ('172.16.47.209', 52472)
    接收数据的长度为: 5
    接收客户端的数据为: hello
    

    说明:

    当客户端和服务端建立连接后,服务端程序退出后端口号不会立即释放,需要等待大概1-2分钟。

    解决办法有两种:

    • 更换服务端端口号
    • 设置端口号复用(推荐大家使用),也就是说让服务端程序退出后端口号立即释放。

    设置端口号复用的代码如下:

    # 参数1: 表示当前套接字
    # 参数2: 设置端口号复用选项
    # 参数3: 设置端口号复用选项对应的值
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    

    网络调试助手充当客户端程序:

    在这里插入图片描述


    • 1导入socket模块
    • 2创建TCP套接字‘socket’
      • 参数1: ‘AF_INET’, 表示IPv4地址类型
      • 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
    • 3绑定端口号‘bind’
      • 参数: 元组, 比如:(ip地址, 端口号)
    • 4设置监听‘listen’
      • 参数: 最大等待建立连接的个数
    • 5等待接受客户端的连接请求‘accept’
    • 6发送数据‘send’
      • 参数: 要发送的二进制数据, 注意: 字符串需要使用encode()方法进行编码
        -7 接收数据‘recv’
      • 参数: 表示每次接收数据的大小,单位是字节,注意: 解码成字符串使用decode()方法
    • 8关闭套接字‘socket’表示通信完成
    展开全文
  • 简单的一个使用java servlet写的服务端程序
  • ACPSample_QRC《Java银联支付服务端程序代码》 ACPSample_QRC《Java银联支付服务端程序代码》 ACPSample_QRC《Java银联支付服务端程序代码》
  • 文章目录1 服务端程序的初步实现1.1 设计实现1.2 代码实现 1 服务端程序的初步实现 1.1 设计实现 服务端设计初步: 设计要素分析: 一般情况下,聊天服务端只负责消息传递。 客户端的连接与断开是两个关键操作,...

    1 服务端程序的初步实现

    1.1 设计实现

    服务端设计初步:
    在这里插入图片描述
    设计要素分析:

    • 一般情况下,聊天服务端只负责消息传递。
    • 客户端的连接与断开是两个关键操作,必须消息通知。
    • 服务端能够随时对指定客户端发送消息。

    如何设计使得服务端能够随时对指定客户端发送消息?

    • 客户端的连接(QTcpSocket对象)有唯一的标识符(ID)。
    • 可以通过ID查找对应的QTcpSocket对象,进而收发消息。

    在这里插入图片描述

    1.2 代码实现

    代码组织如下:
    在这里插入图片描述
    首先看下ServerDemo.cpp中对于连接和断开的处理:
    在这里插入图片描述
    接下来就是ServerHandler的实现:
    在这里插入图片描述

    在这里插入图片描述
    main.cpp代码如下:
    在这里插入图片描述


    参考资料:

    1. QT实验分析教程
    展开全文
  • ios 推送 java 服务端程序 ,与苹果的Apns服务打交道,作为ios客户端程序的服务端(provider)。
  • 封装利用libwebsockets写出的客户端、服务端程序为客户端服务端类 文章目录封装利用libwebsockets写出的客户端、服务端程序为客户端服务端类1.封装2.封装后写wss客户端、服务端3.测试结果4.客户端、服务端类程序 ...
  • java 实现TCP 服务端程序 带用户登录检测带 数据库 来自网络
  • 网络通讯客户端 服务端程序代码 及几篇相关的文献
  • 暗黑战网服务端程序PVPGN,需要与d2gs服务程序配合使用
  • 案例-多任务版TCP服务端程序开发 1. 需求 目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢? 完成多任务,可以使用线程,比进程更加节省内存资源。...
  • 不错的UDP客户端,及服务端程序可以下载
  • c/s聊天模式服务端程序(简单程序,旨在说明原理)
  • 客服端程序(与服务端程序配合使用),下了这程序,在下个服务端程序就行了
  • android上安装好控制端程序后,需要在电脑上安装一个服务端程序
  • memcached客户端和服务端程序和jar包
  • WCF服务简单实例(包含服务端程序,和C#客户端调用程序
  • 一 服务端程序 # 导入模块 import socket # 创建实例 sk = socket.socket() # 定义需要绑定的ip和端口 ip_port = ("127.0.0.1", 8888) # 绑定监听 sk.bind(ip_port) # 最大连接数 sk.listen(5) # ...
  • 聊天室 客户端 服务端程序 非常好的原文件按 是老师写的 可以帮助你很多哦 下载吧
  • 104规约模拟服务端程序,非常好用!有助于工程人员现场调试。
  • TCP+IPv6 客户端 & 服务端 程序简例

    千次阅读 2018-04-06 17:28:15
    本文给出基于IPv6的TCP客户端以及服务端程序样例。 可以参考《TCP+IPv4 客户端 & 服务端 程序简例》进行对比。 服务端: #include <stdio.h> #include <stdlib.h> #...
  • libuv如何实现多线程io模型的服务端程序

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,181
精华内容 12,872
关键字:

服务端程序