

Pythonのクライアント側の通信で、prosessingのサーバー側からデータが来たらそのまま次の処理に、20秒ほど特にクリックによって送られるデータが来なかった場合同じように次の処理に移りたいのですが、方法がわからず困っています。

時間経過によるフラグにしてしまうと後々フラグが立ってしまったり、while文で回すのも考えたのですが、受信したときに抜け出す方法が分かりませんでした。

**ソースコード:**

[code]

    import subprocess
    import time
    import socket
    from threading import Thread
    
    host = '127.0.0.1'
    port = 50007
    WORK = ""
    
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #オブジェクトの作成
    client.connect((host, port)) #サーバーに接続
    client.send("test".encode('utf-8')) #適当なデータ送信
    
    def Get_click():
        response_d = client.recv(4096)
        print (response_d)
        response = response_d.decode('utf-8')
        #届くデータはt01/t02/t03
        return response
    
    time.sleep(2)
    print("start")
    data = Get_click()
    
    if data.find("t01") >= 0 :
        print(1)
    elif data.find("t02") >= 0 :
        print(2)
    elif data.find("t03") >= 0 : 
        print(3)
    else :  #返答がなければここに割り振られたい
        print("error")
    
[/code]


CC BY-SA 4.0
2018-08-09T06:36:33.043
47372
2022-04-13T23:06:10.670
2021-03-11T08:16:53.797
3060
25104
question
python python3
Pythonのソケット通信のタイムオーバー処理


[`socket.settimeout`](https://docs.python.org/ja/3/library/socket.html#socket.socket.settimeout)でタイムアウト時間を設定する、  
というのはいかがでしょうか?

＃`connect`の前に呼び出す必要があります。

### 追記

タイムアウトした場合、`Get_Click()`の返り値を無効なものにすることで、  
`else`条件の処理を行うことができると思います。

[code]

    # 例: タイムアウトしたら、空の値を返す。
    
    def Get_click():
        try:
            response_d = client.recv(4096)
        except socket.timeout:
            response_d = ''
        print (response_d)
        response = response_d.decode('utf-8')
        #届くデータはt01/t02/t03
        return response
    
[/code]


CC BY-SA 4.0
2018-08-10T12:27:08.523
47421
2018-08-11T03:37:49.863
2018-08-11T03:37:49.863
20098
20098
47372
answer