39600


こんにちは、GCEインスタンスと手元のPC間でUDP通信をする方法に関して質問させてください。[こちらのサイト](https://qiita.com/nadechin/items/28fc8970d93dbf16e81b)を参考に、いろいろ試しているのですが、うまく通信ができておりません。アドバイスいただきたく、よろしくお願いいたします。

# 試している内容

  * サーバ：VMインスタンス（OS:Debian GNU/Linux 9 (stretch), f1-micro）

サーバで動かしているコード↓

[code]

    # -*- coding:utf-8 -*-
    import socket
    host = "xxx.xxx.xxx.xxx" #外部IP、内部IP両方試しました
    port = 8088
    serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    serversock.bind((host,port))
    serversock.listen(10)
    print 'Waiting for connections...'
    clientsock, client_address = serversock.accept()
    
    while True:
        rcvmsg = clientsock.recv(1024)
        print 'Received -> %s' % (rcvmsg)
        if rcvmsg == '':
          break
        print 'Type message...'
        s_msg = raw_input()
        if s_msg == '':
          break
        print 'Wait...'
        clientsock.sendall(s_msg)
    clientsock.close()
    
[/code]

  * クライアント：Cloud Shell

クライアントで動かしているコード↓

[code]

    # -*- coding:utf-8 -*-
    import socket
    host = "xxx.xxx.xxx.xxx" #外部IP、内部IP両方試しました
    port = 8088
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    client.connect((host, port))
    client.send("Test Message")
    response = client.recv(4096)
    print response
    
[/code]

  * ファイアウォールルールの設定に以下の２つを追加しました

    * （上り）ターゲットすべてに適用 IP 範囲: 0.0.0.0/0 udp:0-65535
    * （下り）ターゲットすべてに適用 IP 範囲: 0.0.0.0/0 udp:0-65535
  * まずGCE側でサーバ用コードを実行し、「Waiting for connections...」がでてから、Cloud Shellでクライアント用コードを実行しました。

# 困っているところ

  * サーバ側は「Waiting for connections...」と出たまま動かない（"Test Message"が表示されてほしい）
  * クライアント側は、何も出力されない

# 最終的にやりたい内容

  * まずCloud ShellとGCEインスタンスの間でUDP通信ができるようにしたい
  * Cloud Shellで動かしているpythonコードを、手元のPC上のJupyterNotebookに移して、手元のPCとGCEインスタンスの間でUDP通信ができるようにしたい


CC BY-SA 3.0
2017-11-15T07:38:19.307
39591
2017-11-15T14:36:55.117
2017-11-15T14:36:55.117
5288
26204
question
python socket google-compute-engine udp
GCEインスタンスと手元のPC間でUDP通信をしたい


[GCE(Google Compute
Engine)のVMインスタンスのアカウントスコープを後から変更する](https://qiita.com/Sekky0905/items/e1ae602a1a2a4edb17df)
の記事は、お読みになりましたか？


CC BY-SA 3.0
2017-11-15T08:01:26.150
39593
2017-11-15T08:01:26.150
217
39591
answer


TCP と UDP のメリット/デメリットについてはご存知の上で、UDP
通信をしようと思ってサンプルを動かしてみたが動かなかった、という質問だと思って回答します。

質問のコードは完全に TCP を使ったものであり、UDP 通信ではありません。

質問のコードを元に UDP 向けに変更してみました。  
以下のサンプルでいかがでしょうか?

サーバ側:

[code]

    import socket
    host = "0.0.0.0"
    port = 8088
    serversock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    serversock.bind((host,port))
    
    while True:
        print 'Waiting for data...'
        rcvmsg, rcvfrom = serversock.recvfrom(1024)
        print 'Received -> %s' % (rcvmsg)
        if rcvmsg == '':
          break
        print 'Type message...'
        s_msg = raw_input()
        if s_msg == '':
          break
        print 'Wait...'
        serversock.sendto(s_msg, rcvfrom)
    serversock.close()
    
[/code]

クライアント側:

[code]

    import socket
    host = "mike"    # サーバのホスト名
    port = 8088
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    client.connect((host, port))
    client.send("Test Message")
    response = client.recv(4096)
    print response
    
[/code]


CC BY-SA 3.0
2017-11-15T14:14:41.280
39600
2017-11-15T14:14:41.280
5288
39591
answer