@vGrabko99
html, css, js, php, golang, mysql

Как создать несколько файловых серверов в golang?

Вот мой код
package main

import (
	"encoding/json"
	"io"
	"log"
	"net/http"
	"strings"
)

func main() {
	const jsonStream = `
		{"Port": "8080", "Dir": "/home/v-smerti/localhost/public/file_server"}
		{"Port": "8081", "Dir": "/home/v-smerti/localhost/public/file"}
	`
	type Message struct {
		Port, Dir string
	}
	dec := json.NewDecoder(strings.NewReader(jsonStream))
	for {
		var m Message
		if err := dec.Decode(&m); err == io.EOF {
			break
		} else if err != nil {
			log.Fatal(err)
		}

		go http.ListenAndServe(m.Port, http.FileServer(http.Dir(m.Dir)))
	}
}


Я хочу каждой папке дать свой порт доступа (чисто в академических целях).
Во время go run main.go ошибок компилятор не видет. Но софт просто напросто немножко "повисев" оканчивает свою роботу.
Если убрать обьявление go рутины то в логах пишет
8080: /home/v-smerti/localhost/public/file_server
panic: listen tcp: missing port in address 8080

goroutine 1 [running]:
main.main()
	/home/v-smerti/localhost/api/src/file_server/main.go:29 +0x431

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
	/usr/lib/go/src/runtime/asm_386.s:1662 +0x1
exit status 2


Как исправить?
Ещё есть одна проблемка. Если json прочитать из файла и вставить место jsonStream то выходит конфликт типов. Ожидает byte а я пихаю string
# command-line-arguments
./main.go:23: cannot use bs (type []byte) as type string in argument to strings.NewReader


Как исправить ? зарание спасибо.
  • Вопрос задан
  • 449 просмотров
Решения вопроса 1
@kshvakov
только для "чисто в академических целей"

package main

import (
	"encoding/json"
	"io"
	"log"
	"net/http"
	"strings"
)

func main() {
	const jsonStream = `
    {"Port": ":8080", "Dir": "/home/v-smerti/localhost/public/file_server"}
    {"Port": ":8081", "Dir": "/home/v-smerti/localhost/public/file"}
  `
	type Message struct {
		Port, Dir string
	}
	dec := json.NewDecoder(strings.NewReader(jsonStream))
	for {
		var m Message
		if err := dec.Decode(&m); err == io.EOF {
			break
		} else if err != nil {
			log.Fatal(err)
		}

		go http.ListenAndServe(m.Port, http.FileServer(http.Dir(m.Dir)))
	}

	forever := make(chan struct{})
	<-forever
}


ps:
1
missing port in address 8080 - тут же написано нет порта в адресе, либо указываем ip:port, либо :port и слушаем все интерфейсы
2
cannot use bs (type []byte) as type string in argument to strings.NewReader

тоже все написано, нужно "скастить" []byte к string: string(bs)

3 cофт просто напросто немножко "повисев" оканчивает свою роботу.

все верно, main закончила работу, горутины "отдельно" крутятся их никто не ждет

ps2: dec := json.NewDecoder(strings.NewReader(jsonStream)) для работы с потоком (os.Open() как пример работы с локальным файлом), a так json.Unmarshal
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы