質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

871閲覧

pythonでクライアントサーバーシステムを作ってるのですが、GUIで表示されない部分があります。

asdfghjklz

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/02 12:11

前提・実現したいこと

クライアントサーバーシステムを構築していて、複数のクライアントの接続ができるようにしてます。あるクライアントがメッセージを送信すると他のクライアントにも送信されたメッセージが表示されるようにしたいです。GUIを使ってやっています。

しかし、発言を押しても表示されません。どこが間違っているか教えてほしいです。

該当のソースコード

Python

1 2サーバー側 3# -*- coding: utf-8 -*- 4 5import socket 6import select 7 8def send_to(sock,msg): 9 try: 10 sock.send(msg.encode()) 11 return True 12 except: 13 sock.close() 14 return False 15 16def broadcast(socklist,msg): 17 for sock in socklist: 18 if not send_to(sock,msg): 19 sock_list.remove(sock) 20 21host='127.0.0.1' 22port=50000 23backlog=10 24bufsize=4096 25 26server_sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 27print("socket is created") 28 29try: 30 server_sock.bind((host,port)) 31 print("socket bind") 32 server_sock.listen(backlog) 33 print("socket listen") 34 sock_list=[server_sock] 35 client_sock_table={} 36 while True: 37 r_ready_sockets,w_ready_sockets,e_ready_sockets=select.select(sock_list,[],[]) 38 for sock in r_ready_sockets: 39 if sock==server_sock: 40 conn,address=sock.accept() 41 sock_list.append(conn) 42 client_sock_table[address[1]]=conn 43 sock_list.remove(server_sock) 44 broadcast(sock_list,"ポート" + str(address[1]) + "番のユーザーが接続しました") 45 sock_list.append(server_sock) 46 print(str(address)+"is connected") 47 else: 48 try: 49 b_msg=sock.recv(bufsize) 50 msg=b_msg.decode('utf-8') 51 if len(msg)==0: 52 sock.close() 53 sock_list.remove(sock) 54 else: 55 sender_port=None 56 for key,val in client_sock_table.items(): 57 if val==sock: 58 sender_port=key 59 break 60 if sender_port is not None: 61 sock_list.remove(server_sock) 62 broadcast(sock_list,str(sender_port)+":" + msg) 63 sock_list.append(server_sock) 64 except: 65 sock.close() 66 sock_list.remove(sock) 67 sock_list.remove(server_sock) 68 broadcast(sock_list,"someone disconnected") 69 sock_list.append(server_sock) 70except Exception as e: 71 print("Exception!") 72 print(e) 73 server_sock.close() 74 75 76 77クライアント側 78# -*- coding: utf-8 -*- 79 80import tkinter as tk 81import socket, select 82import threading 83 84def send_msg(ev=None): 85 if len(entered_txt.get())<=0: 86 return 87 sock.send(entered_txt.get().encode()) 88 etr.delete(0,tk.END) 89 90def receive_msg(msg): 91 if text_w is None: 92 return 93 text_w.configure(state=tk.NORMAL) 94 text_w.insert(tk.END,msg+"\n") 95 text_w.configure(state=tk.DISABLED) 96 text_w.see(tk.END) 97 98#サーバーから送られてきたメッセージをストックする 99def stock_msg(msg): 100 stocked_msg.append(msg) 101 102#ストックされたメッセージに対してreceive_msgを呼び出す 103def check_msg(): 104 while len(stocked_msg)>0: 105 receive_msg(stocked_msg.pop(0)) 106 #after(time.func) 107 #funcの実行(呼び出し)をtime[ミリ秒]ごとに行う 108 text_w.after(200,check_msg) 109 110root=tk.Tk(None) 111root.title("サンプルチャット") 112 113frame=tk.Frame(master=root,width=480,height=320) 114 115label1=tk.Label(master=frame,text="サンプルチャット",font=('メイリオ','12'),bg="#cccccc") 116label1.place(relx=0,rely=0,relwidth=1.0,relheight=0.1) 117 118#複数行テキスト 119text_w=tk.Text(master=frame,state=tk.DISABLED,font=('メイリオ','10'),bg="white") 120text_w.place(relx=0.05,rely=0.1,relwidth=0.85,relheight=0.7) 121 122#スクロールバー 123sb_y=tk.Scrollbar(master=frame,orient=tk.VERTICAL,command=text_w.yview) 124sb_y.place(relx=0.90,rely=0.1,relwidth=0.05,relheight=0.7) 125text_w.config(yscrollcommand=sb_y.set) 126 127entered_txt=tk.StringVar() 128#1行編集テキスト 129etr=tk.Entry(master=frame,width=30,textvariable=entered_txt) 130etr.bind('<Return>',send_msg) 131etr.place(relx=0.05,rely=0.85,relwidth=0.65,relheight=0.1) 132 133#ボタン 134bt=tk.Button(master=frame,text='発言',bg='skyblue',command=send_msg) 135bt.place(relx=0.75,rely=0.85,relwidth=0.35,relheight=0.1) 136 137frame.pack() 138 139host='127.0.0.1' 140port=50000 141bufsize=4096 142 143sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 144 145#送られてきたメッセージをストックするためのリスト 146stocked_msg=[] 147 148def listen(): 149 try: 150 sock.connect((host,port)) 151 while True: 152 r_ready_sockets,w_ready_sockets,e_ready_sockets=select.select([sock],[],[]) 153 try: 154 recev_msg=sock.recv(bufsize).decode() 155 except: 156 break 157 stock_msg(recev_msg) 158 except Exception as e: 159 print(e) 160 finally: 161 sock.close() 162 receive_msg('サーバとの接続が切断されました') 163check_msg() 164 165thrd=threading.Thread(target=listen) 166thrd.start() 167 168root.mainloop() 169 170

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

server側のbreakとその次の行を削除すれば良いです。

python

1break 2if sender_port is not None:

forループから抜けてしまって永遠にbroadcastされないです。

投稿2020/07/02 13:03

yymmt

総合スコア1615

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asdfghjklz

2020/07/02 13:42

そこのインデントを左にずらしたらできました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問