読者です 読者をやめる 読者になる 読者になる

ami_GS's diary

情報系大学院生の備忘録。ネットワークの勉強にハマっています。

GoとPythonでTCPパケット送受信方法の比較

Python Golang network

こんにちは、もう年末ですねぇ〜〜。
というわけで、ニッチだろうけどネタが出来たので書きます。


はじめに

さて、今までPythonで色々なプログラムを書いてきましたが、そろそろGoをしっかり勉強しようと思っている最近なわけです。
ちょうど今日引っかかって調べた事で、GoとPythonでソケットを開いてデータを送受信する方法について書こうと思います。
コードはなるべくシンプルに書くのでご安心を。


Python

まずはPythonです。

サーバ側

import socket

serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serv.bind(("127.0.0.1", 8080))
serv.listen(1)

while True:
    sock, addr = serv.accept()
    while True:
        data = sock.recv(1024)
        print(data)

クライアント側

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 8080))
sock.send("Hello!!")

サーバ側を起動して、クライアントを動かすと、「Hello!!」の文字列が出力されますね。


Go編

次はGoです。

サーバ側

package main

import (
        "fmt"
        "net"
)

func doSomething(conn net.Conn) {
        buf := make([]byte, 1024)
        _, err := conn.Read(buf)
        if err != nil {
                panic(err)
        }
        fmt.Printf("%s\n", buf)
}

func main() {
        serv, err := net.Listen("tcp", "127.0.0.1:8080")
        if err != nil {                
            panic(err)                 
        }                              
                                   
        for {                          
                conn, err := serv.Accept()   
                if err != nil {            
                    panic(err)             
                }                          
                go doSomething(conn)  
        }                                  
}

クライアント側

package main

import (
        "fmt"
        "net"
)

func main() {
        conn, err := net.Dial("tcp", "127.0.0.1:8080")
        if err != nil {                               
            panic(err)                                
        }                                             

        conn.Write([]byte("Hello!!"))
}

こっちもサーバとクライアントを順に起動すると「Hello!!」が出力されます。
こっちは型付きと言う事もあり、お固く書いてる感じがありますね。


2つの違い

サーバ側で特徴的なのは、
Pythonではsocket.socket()してbind()してlisten()しましたが、
GoではListen()だけでいいんですね、こりゃ楽だ!
それと、Go側ではデータを受け取るReadの引数にバッファーを渡してあげる必要があります。

クライアント側では、
Pythonでは文字列をそのまま送っていますが、Goでは[]byte型を送る必要があります。

最後に

目立つ違いはこれくらいですね。
その他の関数を使うのであれば、それに合った型を付けてあげる必要があります。

それでは皆さん良いGoライフを!!