IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> ggntalk2 2021-07-28 -> 正文阅读

[Python知识库]ggntalk2 2021-07-28

前言

仙仙吐槽我的 ggntalk 不能保持连接,我发现好像在正常通讯过程中持续连接确实还是挺重要的(B/S架构好像就不那么重要),于是就写了一个持续链接版的 ggntalk2

ggntalk2.py

# -*- encoding: utf-8 -*-

"""
    ggntalk2 是 GGN_2015 在 ggntalk 的基础之上实现的新版通讯库
    原先的 ggntalk 每次建立连接后只进行一次通信,现在 GGN_2015 打算让每次建立连接后能够建立多次通信
"""

VERSION = "2021-07-28" # 用发布日期做版本号

import json
from threading import Thread # 采用新的多线程机制
import socket
import traceback

config = {} # 存储配置文件
config_file = "config.json"


def get_config(filename = "config.json"):
    """
        从 配置文件 中获取服务器配置信息
    """
    new_config = {}
    try:
        with open(filename) as f:
            new_config = json.load(f)
    except:
        print("config 文件不存在, 使用默认配置 ...")
        new_config = {"ip":"127.0.0.1", "port":12345, "running": True, "maxlen": 1048576}
        print(new_config)
    return new_config


server = None # 服务器 socket server 对象
running = False # 服务器当前没有正在运行


def keep_alive(connection_socket, addr):
    """
        保持和客户端的持续连接
    """
    while config["running"]:
        print("服务器正在等待 " + str(addr) + "响应 ..")
        message = connection_socket.recv(config["maxlen"]).decode("utf-8") # 等到得到客户端反馈的消息
        print("得到来自 " + str(addr) + " 的消息: " + message)
        if message == "exit()":
            print("接收到 exit 命令,服务器正在关闭")
            connection_socket.send("服务器正在关闭".encode("utf-8"))
            connection_socket.close() # 结束连接
        try:
            ans = eval(message)
        except:
            re_message = traceback.format_exc().encode("utf-8") # 将错误信息结果编码并传回
        else:
            re_message = json.dumps(ans).encode("utf-8") # 将计算结果编码并传回
        finally:
            connection_socket.send(re_message)

def server_run():
    """
        在 server_start 执行后,运行服务器
    """
    global config
    global running
    while config["running"]: # 如果最初 config 文件里的内容就是 running: false,则不会运行
        new_config = get_config(config_file)
        if new_config != config: # 只要检测到 config 文件发生变化,直接停止运行
            config = new_config
            running = False
            break
        print("服务器正在监听中 ip = %s port = %s ..." % (config["ip"], config["port"]))
        try:
            connection_socket, addr = server.accept()

        except Exception as ex: # 这句话是 python3 写法
            print("    服务器 " + str(ex)) # 输出异常信息

        else:
            print("    得到来自 " + str(addr) + " 连接")
            Thread(target=keep_alive, args=(connection_socket, addr)).start() # 在新的线程处理和新线程之间的持续连接

        print("服务器运行结束 ip = %s port = %s ..." % (config["ip"], config["port"]))

def server_start():
    """
        启动服务器 server
    """
    if running:
        print("服务器正在运行,无法再次启动服务器 ...")
    else:
        global server
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, proto=6) # 启动服务器
        server.bind ((config["ip"], config["port"])) # 绑定 ip 端口
        server.listen(128) # 最大监听数

        server_run()


def debug_server():
    """
        用于 ggntalk2 的测试主程序
    """
    print("- 正在运行 ggntalk2 (VERSION = %s) 的测试程序 ..." % (VERSION))
    server_start()


def client_fetch(client_socket, message = "print('hello world!')", max_recvlen = 1048576): # 向服务器发送请求,并接收计算结果
    """
        向正在连接着的服务器发送请求
    """
    client_socket.send(message.encode("utf-8"))
    print("请求发送完毕,正在等待回复 ...")
    re_message = client_socket.recv(max_recvlen).decode("utf-8") # 接收来自服务器的回复信息
    return re_message


def client_connect(server_ip = "127.0.0.1", server_port = 12345):
    """
        尝试与服务器进行连接,连接成功,返回接口类
    """
    try:
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client_socket.connect((server_ip, server_port))
    except:
        print("连接失败 server_ip = %s, server_port = %d" % (server_ip, server_port))
        return None
    else:
        print("连接成功!")
        # client_fetch(client_socket) # 测试用,在 server 输出 hello world!
        return client_socket # 连接成功返回



def client_test(client_socket): # 检测服务器是否还有效
    try:
        client_fetch(client_socket)
    except:
        return False # 连接无效
    else:
        return True # 连接有效

def client_close(client_socket):
    """
        断开与服务器的连接
    """
    return client_fetch(client_socket, "exit()")


if __name__ == "__main__":
    config = get_config(config_file) # 开始时就需要读取配置文件
    debug_server()

config.json

{
    "ip": "127.0.0.1",
    "port": 12345,
    "maxlen": 1048576,
    "running": true
}
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:35:59  更:2021-07-29 11:37:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/25 14:47:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计