zoukankan      html  css  js  c++  java
  • 计算机网络Python_socket聊天室

    前言

    计算机网络小课程设计简单记录,大佬轻点喷,菜哭了
    环境:python3

    基于tcp

    service端

    import socket
    import threading
    con = threading.Condition()
    host = '0.0.0.0'
    port = int(input('请输入服务端口:'))
    #print(type(port))
    s = socket.socket()
    s.bind((host, port))
    s.listen(1)
    print("监听开始")
    data = ""
    def NotifyAll(socket):
        global data
        if con.acquire(): #获取锁
            data = socket.encode('utf-8')
            con.notify_all() #表示当线程放弃对资源占用 通知其他可以执行
            con.release()      #释放锁
    def threadOut(conn, content):        #发送消息
        global data
        while True:
            if con.acquire():
                con.wait()  #放弃资源占用
                if data:
                    try:
                        #print(data)
                        conn.send(data)
                        con.release() #解锁
                    except:
                        con.release()
                        return
    def threadIn(conn, content):  #接收消息
        global data
        while True:
            try:
                temp = conn.recv(1024).decode('utf-8')
                #print(type(temp))
                if not temp:
                    conn.close()
                    return
                if temp == 'exit':
                    conn.s
    
                NotifyAll(temp)
                print(data)
            except:
                temp = content +':exit'
                NotifyAll(temp.decode('utf-8'))
               # print(error)
    while True:
        conn,address = s.accept()   #返回的是元组
        print("连接者:"+str(address[0])+':'+str(address[1]))
        content = conn.recv(1024).decode('utf-8') #传入的姓名
        NotifyAll("欢迎"+content+"加入聊天室")
        #print(data)
        conn.send(data)
        threading.Thread(target=threadOut, args=(conn, content)).start()
        threading.Thread(target=threadIn, args=(conn, content)).start()
    

    client端

    import socket
    import threading
    people_name = ''
    people_send = ''
    
    def client_send(sock):
        global people_name
        global people_send
        while True:
            people_send = input() #接收输入
            people_send = people_name + ':' + people_send
            sock.send(people_send.encode('utf-8'))
            if 'exit' in people_send:
                sock.shutdown(2)
                sock.close()
                break
    
    def client_accept(sock):
        global people_send
        while True:
            try:
                accept = sock.recv(1024).decode('utf-8') #一次接收数据1024
                #print(type(accept))
                if not accept:
                    break
                if accept != people_send:
                    print(accept)
            except:
                print("error")
                break
    people_name = input('输入你的名字:')
    service_ip = input('输入你要连接的ip地址:')
    service_port = int(input('输入你要连接的端口:'))
    sock = socket.socket() #创建socket对象
    sock.connect((service_ip, service_port))    #address的格式为元组(hostname,port)
    sock.send(people_name.encode('utf-8'))
    th_send = threading.Thread(target=client_send, args=[(sock)]) #发送消息线程
    th_send.start() #启动线程
    th_accept = threading.Thread(target=client_accept, args=[(sock)]) #发送消息线程
    th_accept.start() #启动线程
    

    大致效果图


    基于udp

    service端

    import socket
    import threading
    def service_send(s):
        global data
        global address
        while True:
            try:
                print(address)
                data, address_tmp = s.recvfrom(1024)
                if address_tmp not in address: # 不在用户中
                    # 将用户传入聊天室广发给用户
                    address[address_tmp] = data.decode('utf-8')
                    data = data.decode('utf-8') + "加入聊天室"
                    for add in address:
                        print(data)
                        s.sendto(data.encode('utf-8'), add)
                    continue
                # 用户退出
                if 'exit' in data.decode('utf-8'):
                    name = address[address_tmp]
                    del address[address_tmp]
                    s.sendto((name + "你已经退出成功").encode('utf-8'), address_tmp)
                    print(address)
                    for user_addr in address:
                        s.sendto((name + "退出聊天室").encode('utf-8'), user_addr)
                else:
                    data = data.decode('utf-8')
                    # s.sendto(("发送成功").encode('utf-8'), address_tmp)
                    for user_addr in address:
                        if user_addr != address_tmp:
                            s.sendto(data.encode('utf-8'), user_addr)
                    s.sendto(("发送成功").encode('utf-8'), address_tmp)
            except:
                print("error")
    
    if __name__ == '__main__':
        con = threading.Condition()
        host = '0.0.0.0'
        port = int(input('请输入服务端口:'))
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建socket对象
        service_addr = (host, port)
        s.bind(service_addr)  # 绑定地址和端口
        print("监听开始")
        data = ""
        address = {}  # 字典存储用户地址{(addr:name)}
        service_send(s)
    # threading.Thread(target=threadOut, args=(conn, content)).start()
    # threading.Thread(target=threadIn, args=(conn, content)).start()
    

    client端

    import socket
    import threading
    people_name = ''
    people_send = ''
    
    def client_send(sock):
        global people_name
        global people_send
        global address
        while True:
            people_send = input() # 接收输入
            people_send = people_name + ':' + people_send
            sock.sendto(people_send.encode('utf-8'), address)
    def client_accept(sock):
        global people_send
        while True:
            try:
                accept, accept_address = sock.recvfrom(1024) # 一次接收数据1024
                # print(type(accept))
                accept = accept.decode('utf-8')
                if not accept:
                    break
                if accept != people_send:
                    print(accept)
            except:
                print("error")
                break
    people_name = input('输入你的名字:')
    service_ip = input('输入你要连接的ip地址:')
    service_port = int(input('输入你要连接的端口:'))
    address = (service_ip, service_port)
    # print(address)
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建socket对象
    # sock.connect((service_ip, service_port))    #address的格式为元组(hostname,port)
    sock.sendto(people_name.encode('utf-8'), address)
    th_send = threading.Thread(target=client_send, args=[(sock)]) #发送消息线程
    th_send.start()  # 启动线程
    th_accept = threading.Thread(target=client_accept, args=[(sock)]) #发送消息线程
    th_accept.start()  # 启动线程
    

    大致效果图


  • 相关阅读:
    问题大全
    redis学习笔记-03:redis安装
    redis学习笔记-02:为什么使用NoSQL数据库
    redis学习笔记-01:redis简介
    docker学习笔记-05:Docker安装mysql和redis
    docker学习笔记-06:自定义DockerFile生成镜像
    docker学习笔记-05:DockerFile解析
    全栈之路-杂篇-JPA多对多配置分析
    全栈之路-小程序API-JWT令牌详细剖析与使用
    全栈之路-小程序API-Json数据类型的序列化与反序列化
  • 原文地址:https://www.cnblogs.com/Lmg66/p/14833388.html
Copyright © 2011-2022 走看看