zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    64位Windows2008下插入Oracle中文乱码问题解决
    .net自定义WebService WSDL
    IE8下调用Active控件
    IIS7.5下发布应用程序备忘
    在aws ec2上使用root用户登录
    win2008 服务器文件夹权限配置
    thinkphp3.1 多表联合查询代码
    并发 并行 同步 异步 多线程的区别
    学习ES6生成器(Generator)
    node.js+socket.io配置详解
  • 原文地址:https://www.cnblogs.com/sunmingduo/p/10219127.html
Copyright © 2011-2022 走看看