pythonはsocketを用いて一対のマルチ通信を実現する

4665 ワード

最近仕事の中で1対多の需要に出会って、大体現在1つのプログラムは複数のコンピュータの上で運行して、すべてのコンピュータはすべて1つのクライアントに接続して通信して、今プログラムを1対多にするつもりで、それによって1台のコンピュータだけを置くことができます.しかし1台のコンピュータの上で1つのプログラムがそれぞれ複数のクライアントと単独で通信することが現れて、その上データのインタラクティブと表示は必ず指定のインターフェースでなければならなくて、そのため私はいくつかの資料を探して、最後に以下のコードを参考にして修正して、その機能を実現して、ブロガーに感謝します
1.サービス側コードは以下の通りである.
from tkinter import *
from socket import *
import threading


address='127.0.0.1'
port=9000
buffsize=1024
s = socket(AF_INET, SOCK_STREAM)
s.bind((address,port))
s.listen(5)     #     
conn_list = []
conn_dt = {}

def tcplink(sock,addr):
    while True:
        try:
            recvdata=sock.recv(buffsize).decode('utf-8')
            print(recvdata, addr)
            gui.infoList.config(state=NORMAL)
            gui.infoList.insert(END, addr, 'name')
            gui.infoList.insert(END, ':\t')
            gui.infoList.insert(END, recvdata, 'conment')
            gui.infoList.insert(END, '

') gui.infoList.config(state=DISABLED) if not recvdata: break except: sock.close() print(addr,'offline') _index = conn_list.index(addr) gui.listBox.delete(_index) conn_dt.pop(addr) conn_list.pop(_index) break def recs(): while True: clientsock,clientaddress=s.accept() if clientaddress not in conn_list: conn_list.append(clientaddress) conn_dt[clientaddress] = clientsock gui.listBox.insert(END, clientaddress) print('connect from:',clientaddress) # , socket t=threading.Thread(target=tcplink,args=(clientsock,clientaddress)) t.start() class GUI: def __init__(self, root): self.root = root self.leftFrame = Frame(self.root, width=20, height=30) self.leftFrame.grid(row=0, column=0) self.rightFrame = Frame(self.root, width=20, height=30) self.rightFrame.grid(row=0, column=1) Label(self.leftFrame, text=' IP ').grid(row=0, column=0) self.listBox = Listbox(self.leftFrame, width=15, height=10) self.listBox.grid(row=1, column=0) self.entry = Entry(self.rightFrame, font=('Serief', 18), width=30) self.entry.grid(row=0, column=0) self.sendBtn = Button(self.rightFrame, text=' ', command=self.send, width=10) self.sendBtn.grid(row=0, column=1) Label(self.rightFrame, text=' ').grid(row=1, columnspan=2) self.infoList = Text(self.rightFrame, width=40, height=12) self.infoList.grid(row=2, columnspan=2) self.infoList.tag_config('name', background='yellow', foreground='red') self.infoList.tag_config('conment', background='black', foreground='white') def send(self): _index = self.listBox.curselection() conn_dt[self.listBox.get(_index)].sendall(self.entry.get().encode('utf-8')) self.entry.delete(0, END) def createGUI(): global gui root = Tk() gui = GUI(root) root.title(' ') root.mainloop() if __name__ == '__main__': t1 = threading.Thread(target=recs, args=(), name='rec') t2 = threading.Thread(target=createGUI, args=(), name='GUI') t1.start() t2.start()

2.クライアントコードは次のとおりです.
from socket import *
import threading
from tkinter import *

address='127.0.0.1'   #    ip  
port=9000
buffsize=1024
s=socket(AF_INET, SOCK_STREAM)
s.connect((address,port))



def recv():
    while True:
        recvdata = s.recv(buffsize).decode('utf-8')
        gui.listBox.insert(END, recvdata)
        print('
' + recvdata + '
') class GUI: def __init__(self, root): self.root = root self.listBox = Listbox(self.root) self.listBox.pack() self.entry = Entry(self.root) self.entry.pack() self.sendBtn = Button(self.root, text=' ', command=self.send) self.sendBtn.pack() def send(self): senddata = self.entry.get() s.send(senddata.encode()) def createGUI(): global gui root = Tk() gui = GUI(root) root.title(' ') root.mainloop() if __name__ == '__main__': t1 = threading.Thread(target=recv, args=(), name='recv') t2 = threading.Thread(target=createGUI, args=(), name='gui') t1.start() t2.start()

ブロガーに改めて感謝し、原文のリンクを添付します.https://www.cnblogs.com/liyang93/p/9117387.html