• python网络编程 双人多人聊天


    在学习网路编程时,我们首先要考虑的是其中的逻辑,我们借助打电话的形式来了解网络编程的过程,

    我们打电话时属于呼叫方,接电话的属于被呼叫方,那么被呼叫方一直保持在待机状态,等待主呼叫方

    呼叫,只有在被呼叫方接听时双方才可以正常通话。那网络编程逻辑也是如此,在此之前我要调用

    import socket
    import threading

    双人聊天
    1.被呼叫方:
    创建服务套接字≥
    服务套接字绑定主机绑定端口号≥
    建立最大的连接数>
    接收客户套接字>
    线程阻塞>
    发送信息
    import socket
    import threading
    serverrsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    serverrsocket.bind(("192.168.66.180",9999))
    print('绑定端口和主机')
    serverrsocket.listen(5)
    print('开始接收客户请求')
    c=serverrsocket.accept()#线程阻塞
    print("有一个客户请求")
    # msg=c[0].recv(1024)#1024是发送大小
    # print(msg.decode())#接收的数据要解码
    # c[0].send("dong".decode())
    def myrevc(c):
        while True:
            msg=c.recv(1024)#阻塞
            print(msg.decode())
    threading._start_new_thread(myrevc,(c[0],))
    while True:
        msg=input()
        c[0].send(msg.encode())

    2.主呼叫方:

    建立客户套接字》
    send发送的数据要编码》
    阻塞
    import socket
    import threading
    c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print("创建客户套接字")
    c.connect(('192.168.66.180',9999))
    print("我联机到服务")
    #send发送的数据要编码
    # c.send("who are you".encode())
    # msg=c.recv(1024)
    # print(msg.decode())
    def myrevc(c):
        while True:
            msg=c.recv(1024)#阻塞
            print(msg.decode())
    threading._start_new_thread(myrevc,(c,))
    while True:
        msg=input()
        c.send(msg.encode())

    多人聊天:

    1.实现多人聊天也就不存在被呼叫方了,原理是多个主呼叫方把消息一个地方,在返回给各个呼叫方,这时候由于多个用户同时进行

    于是我们要开启多个线程。

    import threading
    import socket
    ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    ss.bind('0.0.0.0',9999)
    ss.listen(10)
    msg=None
    lock1=threading.Lock()
    con=threading.Condition(lock1)
    def server_recv(c,a):
        while True:
            global  msg
            while True:
                str1=c.recv(1024)
                con.acquire
                msg=str1
                msg=str(a)+str1.decode()
                con.notify_all()
                con.release()
    def server_send(c,a):
        global msg
        while True:
            con.acquire()
            con.wait()
            con.release()
            con.send(msg.encode())
    
    while True:
        c,a=ss.accept()
        threading._start_new_thread(server_recv,(c,a))
        threading._start_new_thread(server_send,(c,a))
    
  • 相关阅读:
    notepad++ 在所有行末尾增加符号
    Linux
    [论文阅读] MIR音乐信息检索3
    GitLab CE 常规配置与命令 零点
    Java线程学习之Condition条件
    Java线程学习之ReentrantLock锁
    Java线程学习之读写锁
    PyQt(三) 常见控件二
    PyQt5(四) 线程与绘图处理
    Python 开发规范
  • 原文地址:https://www.cnblogs.com/xiaodong520/p/7774283.html
Copyright © 2020-2023  润新知