pythonでGUI制御のソケット通信をしたいです。
GUIで接続ボタンを押したときにコネクトして、それ以降ボタンを押したときにメッセージを送りたいという場合、一回で接続が切れてしまいます。
ボタンを押すごとに毎回コネクトするのは普通のことなのでしょうか?
切断せずメッセージは送る事はできるのでしょうか?
以下テストで作りました。
socket_server.py をコマンドプロンプトで立ち上げてから、
socket_client.py をダブルクリックで立ち上げてください。動作環境は winndows10 で、動作確認済です。
接続が一回で切れてしまいます。
これで正解という事なら問題ないんですが、、、
正解かどうかがわかりません。ご教授お願いします。
追記です。
with文の問題という指摘がございましたので、socket_client.py を with文を使わないでエラーになってしまうコードに編集しなおしました。接続ボタンを毎回おして接続しなおさないと、メッセージを連続でおくれません。
ソケット通信はこういうものなのでしょうか?
メッセージごとに接続しないといけないものですか?
ご教授お願いします。
socket_serber.py
import socket PORT = 50000 BUFFER_SIZE = 1024 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('127.0.0.1', PORT)) s.listen() while True: (connection, client) = s.accept() try: data = connection.recv(BUFFER_SIZE) print(data.decode(), client) finally: connection.close()
socket_client.py
import tkinter as tk from tkinter import ttk from tkinter import messagebox import socket def connect_func(): global server_address global sock # エントリーボックスの値を取得 serverName = '127.0.0.1' port = 50000 server_address = (serverName, port) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(server_address) def close_func(): sock.clse() def send_func(text): try: sock.send(text.encode()) except: # エラー通知 messagebox.showerror("エラーでござる...") ### GUI ### root = tk.Tk() # ウインドウ名 root.title("接続テスト") # メニューバーの作成 menubar = tk.Menu(root) root.configure(menu = menubar) # File メニュー filemenu = tk.Menu(menubar, tearoff = 0) menubar.add_cascade(label = "ファイル", menu = filemenu) filemenu.add_command(label = "終了", command = lambda: root.destroy()) # ラベルフレーム frame1 = ttk.Labelframe(root, text = "接続先", padding = 10) connect_btn = tk.Button(frame1, text="接続", command = connect_func) connect_btn.pack() close_btn = tk.Button(frame1, text="切断", command = close_func) close_btn.pack() frame1.pack(padx=10, pady=10, anchor=tk.W) # ボタン frame2 = tk.Frame(root) btn1 = tk.Button(frame2, width=20, height=4, text="おはよう", command= lambda: send_func("おはよう")).grid(row = 1, column = 0, padx = 10, pady = 10) btn2 = tk.Button(frame2, width=20, height=4, text="こんにちは", command= lambda: send_func("こんにちは")).grid(row = 1, column = 1, padx = 10, pady = 10) btn3 = tk.Button(frame2, width=20, height=4, text="こんばんは", command= lambda: send_func("こんばんは")).grid(row = 2, column = 0, padx = 10, pady = 10) frame2.pack() # ウインドウサイズの固定 root.resizable(width = False, height = False) root.mainloop()
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/26 08:45
2021/09/28 12:28