GOネットワークプログラミング言語

ソケットプログラミング

ソケットは一般に「ソケット」と呼ばれる、BSD UNIXプロセス間通信機構であるが、IPアドレスとポートを記述するために使用され、ハンドルは、通信チェーンです。ソケットは、APIのTCP / IPネットワークとして理解することができ、それはプログラマがTCP / IPネットワーク上でアプリケーションを開発するために使用できる関数またはルーチンの数を定義します。コンピュータ上で実行するアプリケーションは、一般的に「ソケット」ネットワーク要求や応答を介してネットワークに要求を送信します。
ソケット・ソフトウェア・アプリケーションは、抽象化層を通信するための中間層とTCP / IPプロトコルスイートです。デザインモードでは、ソケットは、実際にファサードパターンであり、それはTCP / IPプロトコルスイートは、ソケットの背後に隠されているの複雑さで、ユーザーが唯一の関連機能ソケットの規定を呼び出す必要があり、ソケットの組織が指定されたプロトコルデータは、その後で満たして行きましょう通信。

GO言語のTCP通信

TCPプロトコル

TCP / IP(伝送制御プロトコル/インターネットプロトコル)伝送制御プロトコル/インターネットプロトコルであるように、接続(コネクション型)配向し、信頼性の高いバイトストリームトランスポート層(トランスポート層)ベースの通信プロトコルでありますコネクション指向のプロトコル、水と同じ送信データは、問題スティッキーパッケージが存在します。

TCPサーバ

TCPサーバは、それは非常に便利である複数のゴルーチンの同時実行性と効率的な移動の言語を作成し、多くのクライアントを接続することができ、それぞれに対処するためのゴルーチンを作成するためのリンクを確立することが可能です。
TCPサーバプログラムのプロセスフロー:

  • リスニングポート
  • リンクを確立するために、受信したクライアント要求
  • ゴルーチンハンドルリンク作成した
    TCPサーバー:
//TCP server端

func process(conn net.Conn)  {
    defer conn.Close()  //关闭连接
    for {
        reader := bufio.NewReader(conn)
        var buf [128]byte
        n,err := reader.Read(buf[:])    //读取数据
        if err != nil{
            fmt.Println("连接客户端失败,错误信息:",err)
        }
        recvStr := string(buf[:n])
        fmt.Println("收到客户端信息:",recvStr)
        conn.Write([]byte(recvStr)) //发送数据
    }
}
func main()  {
    listen,err := net.Listen("tcp","127.0.0.1:8888")
    if err != nil{
        fmt.Println("监听失败,错误:",err)
        return
    }
    for {
        conn,err := listen.Accept() //建立连接
        if err!= nil{
            fmt.Println("建立连接失败,错误:",err)
            continue
        }
        go process(conn)    //启动一个goroutine处理连接
    }
}

TCPクライアント

次のようにTCPクライアントTCP通信プロセスは、次のとおりです。

  • リンクは、サーバとの間で確立されています
  • データを送受信します
  • 閉じるリンク

TCPクライアント:

//客户端

func main()  {
    conn ,err := net.Dial("tcp","127.0.0.1:8888")
    if err != nil {
        fmt.Println("连接失败,错误:",err)
        return
    }
    defer conn.Close()
    inputReader := bufio.NewReader(os.Stdout)
    for {
        input, _ := inputReader.ReadString('\n')    //读取用户输入
        inputInfo := strings.Trim(input,"\r\n")
        if strings.ToUpper(inputInfo) == "q"{
            return  //如果输入q就退出
        }
        _,err = conn.Write([]byte(inputInfo))   //发送数据
        if err != nil{
            return 
        }
        buf := [512]byte{}
        n,err := conn.Read(buf[:])
        if err != nil{
            fmt.Println("接受失败,错误:",err)
            return 
        }
        fmt.Println(string(buf[:n]))
    }
}

まず、クライアントを開始した後、サーバーを起動します。

$go run main.go
我是客户端
我是客户端
$go run main.go
收到客户端信息: 我是客户端

GO言語のUDP通信

UDP合意

UDPプロトコル(ユーザ・データグラム・プロトコル)は、ユーザデータグラムプロトコルの中国名であり、OSI(開放型システム間相互接続、Open Systems Interconnection)参照モデルは、接続を確立し、データを直接送信することができずに、非トランスポート層プロトコル接続でありますレセプションには、何の通信タイミング信頼できないではないが、一般的にライブ映像関連分野に使用リアルタイムUDPプロトコルは、より良いです。

UDPサーバー

//服务端
func main()  {
    listen,err := net.ListenUDP("udp",&net.UDPAddr{
        IP:net.IPv4(0,0,0,0),
        Port:8888,
    })
    if err != nil{
        fmt.Println("监听失败,错误:",err)
        return
    }
    defer listen.Close()
    for {
        var data [1024]byte
        n,addr,err := listen.ReadFromUDP(data[:])
        if err != nil{
            fmt.Println("接收udp数据失败,错误:",err)
            continue
        }
        fmt.Printf("data:%v addr:%v count:%v\n", string(data[:n]), addr, n)
        _ ,err = listen.WriteToUDP(data[:n],addr)   //发送数据
        if err != nil{
            fmt.Println("发送数据失败,错误:",err)
            continue
        }
    }
}

UDPクライアント

//客户端
func main()  {
    socket,err := net.DialUDP("udp",nil,&net.UDPAddr{
        IP:net.IPv4(0,0,0,0),
        Port:8888,
    })
    if err != nil{
        fmt.Println("连接服务器失败,错误:",err)
        return
    }
    defer socket.Close()
    sendData := []byte("hello world!")
    _,err = socket.Write(sendData)
    if err != nil{
        fmt.Println("发送数据失败,错误:",err)
        return
    }
    data := make([]byte,4096)
    n,remoteAddr,err := socket.ReadFromUDP(data)
    if err != nil{
        fmt.Println("接受数据失败,错误:",err)
        return
    }
    fmt.Printf("recv:%v addr:%v count:%v\n", string(data[:n]), remoteAddr, n)
}

まず、クライアントを開始した後、サーバーを起動します。

$go run main.go
recv:hello world! addr:127.0.0.1:8888 count:12
$go run main.go
data:hello world! addr:127.0.0.1:51222 count:12

HTTPクライアントとサーバー

HTTPプロトコル

ハイパーテキスト転送プロトコル(HTTP、ハイパーテキスト転送プロトコル)伝送プロトコルのインターネットで最も広く使用されている方法で、すべてのWWW文書は、この規格に準拠しなければなりません。HTTPは元々の目的は、HTMLページを公開し、受信するための方法を提供することにある設計されました。

HTTPサーバ

ネット/ HTTPパケットは、さらにネットにパケットをカプセル化され、データがHTTPプロトコルの処理専用します。

// http server
func sayHi(w http.ResponseWriter,r *http.Request)  {
    fmt.Fprintln(w,"你好,ares!")
}
func main()  {
    http.HandleFunc("/",sayHi)
    err := http.ListenAndServe(":8888",nil)
    if err != nil{
        fmt.Println("Http 服务建立失败,err:",err)
        return
    }
}

HTTPクライアント

func main() {
    resp, err := http.Get("https://www.baidu.com/")
    if err != nil {
        fmt.Println("get failed, err:", err)
        return
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    fmt.Printf("%T\n",body)
    fmt.Println(string(body))
}

ターミナルで実行した後、出力www.baidu.comホームコンテンツのことができるようになります。

おすすめ

転載: www.cnblogs.com/aresxin/p/GO-yu-yan-wang-luo-bian-cheng.html
おすすめ