pythonはsocketを用いて一対のマルチ通信を実現する
4665 ワード
最近仕事の中で1対多の需要に出会って、大体現在1つのプログラムは複数のコンピュータの上で運行して、すべてのコンピュータはすべて1つのクライアントに接続して通信して、今プログラムを1対多にするつもりで、それによって1台のコンピュータだけを置くことができます.しかし1台のコンピュータの上で1つのプログラムがそれぞれ複数のクライアントと単独で通信することが現れて、その上データのインタラクティブと表示は必ず指定のインターフェースでなければならなくて、そのため私はいくつかの資料を探して、最後に以下のコードを参考にして修正して、その機能を実現して、ブロガーに感謝します
1.サービス側コードは以下の通りである.
2.クライアントコードは次のとおりです.
ブロガーに改めて感謝し、原文のリンクを添付します.https://www.cnblogs.com/liyang93/p/9117387.html
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