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