マルチプロセス及び、ソケット通信におけるソケットリストの共有
pythonにてクイズアプリを作っています。
サーバー側のボタン入力により、クライアント側に問題文を出力するといった機能を実装中に以下のエラーメッセージ、および事象が発生しました。
プロセス間のソケットリストの共有において有効な手段を教えていただきたいです。
問題① ボタンを押してもクライアント側に問題文が表示されない。
問題② ボタンを2回押すとサーバーのプログラムが強制終了する
TypeError: 'Queue' object is not iterable
quiz_server.py
python
1import socket 2import select 3 4import tkinter as tk 5from multiprocessing import Process,Queue 6from collections import deque 7 8 9def broadcast_quiz(sock_list_q, msg): 10 11 socklist = list(deque(sock_list_q)) 12 13 for sock in socklist: 14 #send_to でソケットに対し、メッセージを送信 15 if not send_to(sock,msg): 16 sock_list_q.deque(sock) 17 18def questions(sock_list_q,i): 19 def inner(): 20 21 sock_list_q.get() 22 23 quiz_list = ["問題1", 24 "問題2"] 25 broadcast_quiz(sock_list_q, quiz_list[i]) 26 return inner 27 28 29def tkinter(sock_list_q): 30 31 32 bt = tk.Button(frame, text="問題(" + str(i+1) + ")",height = 3,bg="skyblue",command = questions(sock_list_q,i))#ボタンを押すとクライアントに問題を出力 33 buttons.append(bt) 34 bt.pack(fill=tk.X) 35 36 root.mainloop() 37 38 39def socket_communication(sock_list_q): 40 41 host = 'localhost' 42 port = 50001 43 backlog = 10 44 bufsize = 4096 45 46 server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 47 print("socket is created") 48 49 try: 50 server_sock.bind((host, port)) 51 print("socket bind") 52 server_sock.listen(backlog) 53 print("socket listen") 54 55 sock_list = [server_sock] 56 57 #クライアントのソケットをポートで管理するために、辞書型でソケットを保存する 58 client_sock_table = {} 59 60 while True: 61 r_ready_sockets, w_ready_sockets, e_ready_sockets = select.select(sock_list, [], []) 62 for sock in r_ready_sockets: 63 if sock == server_sock: 64 conn,address = sock.accept() 65 sock_list.append(conn) 66 #ポートをキーとしてソケットを保存する 67 client_sock_table[address[1]] = conn 68 sock_list.remove(server_sock) 69 broadcast(sock_list,"ポート" + str(address[1]) + "番のユーザーが接続しました") 70 sock_list.append(server_sock) 71 72 sock_list_q.put(sock_list) 73 74 75 else: 76 try: 77 b_msg = sock.recv(bufsize) 78 msg = b_msg.decode('utf-8') 79 if len(msg) == 0: 80 sock.close() 81 sock_list.remove(sock) 82 else: 83 sender_port = None 84 for key, val in client_sock_table.items(): 85 if val == sock: 86 sender_port = key 87 break 88 if sender_port is not None: 89 sock_list.remove(server_sock) 90 sock_list.append(server_sock) 91 except: 92 sock.close() 93 sock_list.remove(sock) 94 sock_list.remove(server_sock) 95 sock_list.append(server_sock) 96 97 except Exception as e: 98 print("Exception!") 99 print(e) 100 server_sock.close() 101 102def main(): 103 104 sock_list_q = Queue() 105 106 process1 = Process(target = tkinter, args=[sock_list_q]) 107 process2 = Process(target = socket_communication, args=[sock_list_q]) 108 process1.start() 109 process2.start() 110 111if __name__ == '__main__': 112 main()
補足情報
現在、チャット機能を拡張しながら実装を行っているため、チャット機能+サーバーのボタンによる問題のチャット欄への出力を目的としています。
アドバイスいただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。