Временная блокировка адреса golang net/http

Изучаю golang. Пишу логгер(для практики). Клиент отправляет строки на сервер посредством net/http. Сервер принимает строку и пишет в файл. Проблема:Клиент отправляет 30000 запросов в 20 потоков. Сервер принимает примерно 28000 сообщений, затем блокируется. Через некоторое время(пару минут) снова могу отсылать данные. Не могу понять в чем проблема. Спасибо за уделенное мне время! Вывод клиента при блокировке:

Post http://127.0.0.1:8080/log: dial tcp 127.0.0.1:8080: connect: cannot assign requested address

Код сервера:

package main

import (
    "bufio"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "sync"
)

const namelogfile = "logfile.log"

var logfile *bufio.Writer
var wg sync.WaitGroup
var ch chan string

func save(ch *chan string) {
    var err error
    var str string
    var f *os.File

    _, err = os.Stat(namelogfile)
    if err == nil {
        os.Remove(namelogfile)
    }

    f, err = os.Create(namelogfile)

    if err != nil {
        log.Panic(err)
    }
    defer f.Close()
    for {
        str = <-*ch
        if str == "qiut" {
            return
        }
        f.WriteString(str)
    }
    wg.Done()
}
func logger(w http.ResponseWriter, r *http.Request) {

    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        fmt.Println(err)
        return
    }
    ch <- string(body)

    fmt.Fprintf(w, "%v OK\n", 200)
    err = r.Body.Close()
    if err != nil {
        fmt.Println(err)
        return
    }

}

func main() {
    ch = make(chan string, 1000)
    go save(&ch)

    wg.Add(1)

    http.HandleFunc("/log", logger)
    http.ListenAndServe(":8080", nil)

    wg.Wait()
}

Код клиента:

package main

import (
    "flag"
    "fmt"
    "net/http"
    "strings"
    "sync"
)

var wg sync.WaitGroup

func post(url, message string, n int) {
    defer wg.Done()
    for i := 0; i < n; i++ {
        mesg := strings.NewReader(message)
        r, err := http.Post(url, "", mesg)
        if err != nil {
            fmt.Println(err)
            return
        }
        r.Body.Close()
    }
}
func main() {
    o := flag.Int("o", 1, "Количество потоков")
    n := flag.Int("n", 10, "Количество запросов")
    url := flag.String("url", "http://127.0.0.1:8080/log", "url для запросов")
    message := flag.String("msg", "Hello there!\n", "Сообщение")
    flag.Parse()

    fmt.Printf("Отправка %v запросов на %v в %v потоков\n", *n, *url, *o)

    thr := *o
    num := *n / thr

    for i := 0; i < thr; i++ {

        go post(*url, *message, num)
        wg.Add(1)

    }

    wg.Wait()

    fmt.Println("Закончили")
}


Ответы (0 шт):