質問するログイン新規登録

回答編集履歴

2

コードがちゃんと表示されていなかったので、書き直しました。

2021/09/29 00:49

投稿

m-hana
m-hana

スコア10

answer CHANGED
@@ -1,10 +1,10 @@
1
- いろいろためしてみたのですが、やはりGUIボタンを押すごとに接続が切れてしまうので、送信ボタンを押すごとにコネクトしなおすというやりかたで対処することにします。連打してもちゃんとメッセージが送れるので大丈夫かなと。それよりループで待機しているほうがスペックを使うと思うので、この方法で行きます。
1
+ いろいろためしてみたのですが、やはりGUIの送信ボタンを押すごとに接続が切れてしまうので、送信ボタンを押すごとにコネクトしなおすというやりかたで対処することにします。連打してもちゃんとメッセージが送れるので大丈夫かなと。それよりループで待機しているほうがスペックを使うと思うので、この方法で行きます。
2
2
  回答いただいたみなさま、ありがとうございました。とても勉強になりました!
3
3
 
4
- 以下コードになりますが、自動でマークダウン方式なるものに変換されてインデントがつきませんので、見にくいです
4
+ 以下コードになります。
5
5
 
6
6
  server.py
7
- -----------------------------------------------------------------------
7
+ ```
8
8
  import socket
9
9
 
10
10
  PORT = 50000
@@ -20,9 +20,10 @@
20
20
  print(data.decode(), client)
21
21
  except:
22
22
  print("error!!!")
23
+ ```
23
24
 
24
25
  client.py
25
- -----------------------------------------------------------------------
26
+ ```
26
27
  import tkinter as tk
27
28
  from tkinter import ttk
28
29
  from tkinter import messagebox
@@ -30,8 +31,8 @@
30
31
  import time
31
32
  from datetime import datetime
32
33
 
33
- INTERVAL = 3
34
+ INTERVAL = 3 # ソケット接続時のリトライ待ち時間
34
- RETRY = 5
35
+ RETRY = 5 # ソケット接続時のリトライ回数
35
36
 
36
37
  class SocketClient():
37
38
  def __init__(self):
@@ -43,6 +44,8 @@
43
44
  def host_check(self):
44
45
  client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
45
46
 
47
+ # 確認のために一回接続して成功したら閉じる
48
+ # サーバーとの接続 RETRY の回数だけリトライ
46
49
  for x in range(RETRY):
47
50
  try:
48
51
  client_socket.connect((self.host, self.port))
@@ -52,6 +55,7 @@
52
55
  self.socket = None
53
56
  break
54
57
  except socket.error:
58
+ # 接続を確立できない場合、INTERVAL 秒待ってリトライ
55
59
  time.sleep(INTERVAL)
56
60
  print('[{0}] retry after wait{1}s'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), str(INTERVAL)) )
57
61
 
@@ -63,8 +67,10 @@
63
67
  self.socket = client_socket
64
68
  print('[{0}] server connect -> address : {1}:{2}'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), self.host, self.port) )
65
69
  except socket.error:
70
+ # エラー通知
66
71
  messagebox.showerror("エラーでござる...", "アドレスを入力してください。")
67
72
 
73
+ # サーバーへコマンド送信関数
68
74
  def send(self, text):
69
75
  try:
70
76
  self.connect()
@@ -72,33 +78,41 @@
72
78
  self.socket.close()
73
79
  self.socket = None
74
80
  except:
81
+ # エラー通知
75
82
  messagebox.showerror("エラーでござる...")
76
83
 
77
84
  client = SocketClient()
78
85
 
86
+ ### GUI ###
79
87
 
80
88
  root = tk.Tk()
89
+ # ウインドウ名
81
90
  root.title("接続テスト")
82
91
 
83
92
 
93
+ # メニューバーの作成
84
94
  menubar = tk.Menu(root)
85
95
  root.configure(menu = menubar)
86
-
96
+ # File メニュー
87
97
  filemenu = tk.Menu(menubar, tearoff = 0)
88
98
  menubar.add_cascade(label = "ファイル", menu = filemenu)
89
99
  filemenu.add_command(label = "終了", command = lambda: root.destroy())
90
100
 
101
+ # ラベルフレーム
91
102
  frame1 = ttk.Labelframe(root, text = "接続先:localhost", padding = 10)
92
103
  connect_btn = tk.Button(frame1, text="接続確認", command= lambda: client.host_check())
93
104
  connect_btn.pack()
94
105
  frame1.pack(padx=10, pady=10, anchor=tk.W)
95
106
 
107
+ # ボタン
96
108
  frame2 = tk.Frame(root)
97
109
  btn1 = tk.Button(frame2, width=20, height=4, text="おはよう", command= lambda: client.send("おはよう")).grid(row = 1, column = 0, padx = 10, pady = 10)
98
110
  btn2 = tk.Button(frame2, width=20, height=4, text="こんにちは", command= lambda: client.send("こんにちは")).grid(row = 1, column = 1, padx = 10, pady = 10)
99
111
  btn3 = tk.Button(frame2, width=20, height=4, text="こんばんは", command= lambda: client.send("こんばんは")).grid(row = 2, column = 0, padx = 10, pady = 10)
100
112
  frame2.pack()
101
113
 
114
+ # ウインドウサイズの固定
102
115
  root.resizable(width = False, height = False)
103
116
 
104
- root.mainloop()
117
+ root.mainloop()
118
+ ```

1

インデントが付かない。

2021/09/29 00:49

投稿

m-hana
m-hana

スコア10

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  いろいろためしてみたのですが、やはりGUIでボタンを押すごとに接続が切れてしまうので、送信ボタンを押すごとにコネクトしなおすというやりかたで対処することにします。連打してもちゃんとメッセージが送れるので大丈夫かなと。それよりループで待機しているほうがスペックを使うと思うので、この方法で行きます。
2
2
  回答いただいたみなさま、ありがとうございました。とても勉強になりました!
3
3
 
4
- 以下コードになります。
4
+ 以下コードになりますが、自動でマークダウン方式なるものに変換されてインデントがつきませんので、見にくいです
5
5
 
6
6
  server.py
7
7
  -----------------------------------------------------------------------