• UDP聊天器 服务器版 支持离线消息 支持净网过滤


    #服务器端

    #==========================================================

    #导入模块
    import socket
    import threading
    import re
    #设置全局变量flag
    flag = 0
    #设置离线消息列表
    msg_list = []
    #创建udp套接字
    udp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    #绑定ip端口
    udp_server_socket.bind(("", 5858))
    while True:
    # 接收来自双方的消息
    msg, ip_port = udp_server_socket.recvfrom(1024)
    # 解析双方的ip和端口
    print("消息来自:", ip_port[0], "端口:", ip_port[1])
    #判断是否已给ip_port1赋值
    if flag == 0:
    ip_port1 = ip_port
    flag = 1
    else:
    #如果已经赋值,则判断本次获得的ip和端口是否和ip_port1相同,不同则赋值给ip_port2
    if ip_port != ip_port1:
    ip_port2 = ip_port
    for msg_data in msg_list:
    print(msg_data)
    udp_server_socket.sendto(msg_data, ip_port2)
    break
    else:
    udp_server_socket.sendto("对方不在线,本次消息将转为离线消息!".encode('gbk'), ip_port)
    msg_list.append(msg)
    print(msg_list)

    #循环接收
    while True:
    #接收消息
    msg, ip_port = udp_server_socket.recvfrom(1024)
    # 获取消息来源的ip和端口
    print("消息来自:", ip_port[0], "端口:", ip_port[1])
    #判断消息内容,不符合法规进行过滤
    msg1 = re.sub("坏","好",msg.decode('gbk'))
    msg = msg1.encode('gbk')
    # 给双方回复消息
    if ip_port == ip_port1:
    udp_server_socket.sendto(msg, ip_port2)
    if ip_port == ip_port2:
    udp_server_socket.sendto(msg, ip_port1)

    #客户端

    #==========================================================

    """UDP聊天器多任务版(两个子线程)"""
    #导入多线程及套接字模块
    import socket
    import threading
    import sys

    #创建客户端类
    class UdpClient(object):
    #创建init方法,初始化变量
    def __init__(self):
    # 创建udp套接字
    self.udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.params = int(sys.argv[1])
    #创建接收方法
    def recv_msg(self,current_socket):
    #循环接收消息并显示
    while True:
    #接收数据
    recv_data,ip_port = current_socket.recvfrom(1024)
    #转码
    recv_message = recv_data.decode('gbk')
    #输出
    print(" ",recv_message," ")

    #创建发送方法
    def send_msg(self,current_socket):
    # 循环发送用户输入的消息
    while True:
    # 获取用户输入的内容
    send_msg = input("输入的消息") + " "
    # 转码
    send_data = send_msg.encode('gbk')
    # 发送二进制数据
    current_socket.sendto(send_data, ("127.0.0.1", self.params))

    def run(self):
    # 向服务器发送hello包,让服务器找到我
    self.udp_socket.sendto("".encode('gbk'), ("127.0.0.1", 5858))
    # 创建接收消息的子线程
    recv_thread = threading.Thread(target=self.recv_msg, args=(self.udp_socket,))
    send_thread = threading.Thread(target=self.send_msg, args=(self.udp_socket,))
    # 启动接收消息子线程
    recv_thread.start()
    send_thread.start()
    send_thread.join()
    recv_thread.join()
    # 关闭套接字
    self.udp_socket.close()
    clientA = UdpClient()
    clientA.run()
  • 相关阅读:
    hdu 1077计算几何
    hdu 1110几何题
    hdu 4430二分枚举
    numpy常用技巧
    python中数组(list/array)不会复制,而是直接引用
    怎么在ASP.NET 2.0中使用Membership
    2分法通用存储过程分页(top max模式)版本(性能相对之前的not in版本极大提高)
    Oracle大数据量分页通用存储过程
    JavaScript 对象与数组参考大全
    ajax框架比较
  • 原文地址:https://www.cnblogs.com/sunmingduo/p/10219127.html
Copyright © 2020-2023  润新知