Временная блокировка адреса 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("Закончили")
}