小卷331 2022-11-06 17:36 采纳率: 92.9%
浏览 54
已结题

用python实现socket通讯出现的问题

这是服务端


import socket
import threading
import socketserver


nick=''

data=''

def Notifyall(sentence):
    global data
    if condition.acquire():
        data=sentence
        condition.notifyAll()
        condition.release()


def severs_send(conn,nick):
    global data
    while True:
        if condition.acquire():
            condition.wait()
            if data:
                try:
                    conn.send(data)
                    condition.release()
                except:
                    condition.release()
                    return


def severs_accept(conn,nick):
    while True:
        try:
            indata = sock.recv(1024).decode('utf-8')
            if not indata:
                conn.close()
                return
            Notifyall(indata)
            print(data)
        except:
            Notifyall(nick.decode()+'error')
            print(data)
            return

condition=threading.Condition()

ip = input("input the server ip address:")
port = 8888
sock = socket.socket()
print('socket created')
sock.bind((nick,port))
sock.listen(5)
print("socket new listening")

while True:
    conn,address=sock.accept()
    print('connect with'+address[0]+':'+str(address[1]))
    nick = conn.recv(1024)
    Notifyall('WELCOME'+str(nick)+'to this chatroom!')
    print(data)
    conn.send(data.encode(encoding='utf_8', errors='strict'))
    threading.Thread(target=severs_accept, args=(conn, nick)).start()
    threading.Thread(target=severs_send, args=(conn, nick)).start()

这是客户端

import socket
import threading

outstring=''
nick=''
instring=''

def client_send(sock):
    global outstring
    while True:
        outstring=input()
        outstring=nick+':'+outstring
        sock.send(outstring.encode(encoding='utf_8', errors='strict'))

def client_accept(sock):
    global instring
    while True:
        try:
            instring=sock.recv(1024)
            if not instring:
                break
            else:
                print(instring)
        except:
            break

nick=input("input your nickname:")

ip=input("input the server ip address:")
port=8888
sock=socket.socket(socket.AF_INET)
sock.connect((ip,port))
sock.send(nick.encode(encoding='utf_8', errors='strict'))

threading.Thread(target=client_send,args=(sock,)).start()
threading.Thread(target=client_accept,args=(sock,)).start()

运行出来以后,一个客户端发的消息无法出现在其他客户端上显示,有没有dl看看这出了什么问题

  • 写回答

2条回答 默认 最新

  • 游一游走一走 2022-11-06 18:26
    关注
    
    import socket
    import threading
    import socketserver
    
    
    nick=''
    
    data=''
    
    def Notifyall(sentence):
        global data
        if condition.acquire():
            data=sentence
            condition.notifyAll()
            condition.release()
    
    
    def severs_send(conn,nick):
        global data
        while True:
            if condition.acquire():
                condition.wait()
                if data:
                    try:
                        conn.send(data.encode('utf-8'))
                        condition.release()
                    except:
                        condition.release()
                        return
    
    
    def severs_accept(conn,nick):
        while True:
            try:
                indata = conn.recv(1024).decode('utf-8')
                if not indata:
                    conn.close()
                    return
                Notifyall(indata)
                print(data)
            except:
                Notifyall(nick.decode()+'error')
                print(data)
                return
    
    condition=threading.Condition()
    # ip = input("input the server ip address:")
    port = 8888
    sock = socket.socket()
    print('socket created')
    sock.bind((nick,port))
    sock.listen(5)
    print("socket new listening")
    
    while True:
        conn,address=sock.accept()
        print('connect with'+address[0]+':'+str(address[1]))
        nick = conn.recv(1024)
        Notifyall('WELCOME'+str(nick)+'to this chatroom!')
        print(data)
        conn.send(data.encode(encoding='utf_8', errors='strict'))
        threading.Thread(target=severs_accept, args=(conn, nick)).start()
        threading.Thread(target=severs_send, args=(conn, nick)).start()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 已采纳回答 11月6日
  • 修改了问题 11月6日
  • 创建了问题 11月6日

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?