golangのネットワークプログラミングtcp

2673 ワード

// code_050_socket_knowledge project main.go
package main

import (
    "fmt"
)

//TCP C/S  
//TCP   :net.Dial()   Write()  Read()  Close()
//TCP   :net.Listen() Accept() Read()  Write() Close()
/*
  Unix        “     ”,
      “  open –>   write/read –>   close”     。
  Socket          ,   Socket          I/O,Socket         。
  Socket                 :Socket(),          Socket   ,
         、            Socket   
*/

//   Socket     :  Socket(SOCK_STREAM)     Socket(SOCK_DGRAM)。

func main() {
    fmt.Println("Hello World!")
}

サーバ
// code_051_tcp_service project main.go
package main

import (
    "fmt"
    "log"
    "net"
    "strings"
)

func dealConn(conn net.Conn) {
    defer conn.Close()

    ipAddr := conn.RemoteAddr().String()
    fmt.Println(ipAddr, "    ")

    buf := make([]byte, 1024)
    for {
        //           
        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println(err)
            return
        }

        //    ,       
        result := buf[:n]
        fmt.Printf("       [%s]==>[%d]:%s
", ipAddr, n, string(result)) if "exit" == string(result) { fmt.Println(ipAddr, " ") return } conn.Write([]byte(strings.ToUpper(string(result)))) } } func main() { listenner, err := net.Listen("tcp", "127.0.0.1:8001") //go :An attempt was made to access a socket in a way forbidden by its access permissions. if err != nil { log.Fatal(err) //log.Fatal() panic } for { conn, err := listenner.Accept() if err != nil { log.Println(err) continue } go dealConn(conn) } }

クライアント:
// code_052_tcp_client project main.go
package main

import (
    "fmt"
    "log"
    "net"
)

func main() {
    //          
    conn, err := net.Dial("tcp", "127.0.0.1:8001")
    if err != nil {
        log.Fatal(err) //log.Fatal()   panic
        return
    }

    defer conn.Close() //  

    buf := make([]byte, 1024) //   
    for {
        fmt.Printf("        :")
        fmt.Scan(&buf) //   Python  input-->>buf = input("        ")
        fmt.Printf("     :%s
", string(buf)) conn.Write(buf) n, err := conn.Read(buf) if err != nil { fmt.Println(err) return } result := buf[:n] fmt.Printf(" [%d]:%s
", n, string(result)) } }