Не могу понять, как использовать буферы с двоичным веб-сокетом - PullRequest
0 голосов
/ 04 февраля 2019

все!Я пытаюсь заставить мой код go работать с последовательной консолью openstack.Это выставлено через веб-сокет.И у меня есть проблемы с этим.

Я нашел gorrilla websocket lib (что здорово) и взял этот пример в качестве ссылки

С несколькими настройками, теперь у меня естькод вроде этого:

package main
import (
"log"
"net/url"
"os"
"os/signal"
"time"
"net/http"

"github.com/gorilla/websocket"
)


func main() {
DialSettings := &websocket.Dialer {
    Proxy:            http.ProxyFromEnvironment,
    HandshakeTimeout: 45 * time.Second,
    Subprotocols: []string{"binary",},
    ReadBufferSize: 4096,
    WriteBufferSize: 4096,
}
log.SetFlags(0)
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)

u, _ := url.Parse("ws://172.17.0.64:6083/?token=d1763f2b-3466-424c-aece-6aeea2a733d5") //websocket url  as it outputs from 'nova get-serial-console test' cmd
log.Printf("connecting to %s", u.String())

c, _, err := DialSettings.Dial(u.String(), nil)
if err != nil {
    log.Fatal("dial:", err)
}
defer c.Close()

done := make(chan struct{})

go func() {
    defer close(done)
    for {
        _, message, err := c.ReadMessage()
        if err != nil {
            log.Println("read:", err)
            return
        }
        log.Printf("%s", message)
    }
}()
c.WriteMessage(websocket.TextMessage, []byte("\n")) //just to force output to console

for {
    select {
    case <-done:
        return
    case <-interrupt:
        log.Println("interrupt")

        // Cleanly close the connection by sending a close message and then
        // waiting (with timeout) for the server to close the connection.
        err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
        if err != nil {
            log.Println("write close:", err)
            return
        }
        select {
        case <-done:
        case <-time.After(time.Second):
        }
        return
    }
}

}

И я получаю вывод, как это:

connecting to ws://172.17.0.64:6083/?token=d1763f2b-3466-424c-aece-6aeea2a733d5


CentOS Linux 7
(C
ore)
K
erne
l
3.10.0-862.el7.x86_64
 o
n an
 x
86_64

centos
-test login:

Всего беспорядка ...

Я думаю,это потому, что я получаю только куски байтов без возможности разделить их.Мне нужен некоторый буфер для их хранения, и когда я делаю что-то вроде bufio.ReadLine.Но я не самый опытный программист, и у меня нет идей, как это сделать.В конце мне просто нужны строки для работы.

1 Ответ

0 голосов
/ 04 февраля 2019

Пакет log записывает каждое сообщение журнала в отдельной строке.Если сообщение журнала не заканчивается новой строкой, то пакет журнала добавит его.

Эти дополнительные новые строки искажают вывод.Чтобы исправить вывод, замените вызов на log.Printf("%s", message) функцией, которая не добавляет новые строки к выводу.Вот некоторые параметры:

Записать сообщение в stderr (то же место назначения, что и в конфигурации пакета журнала по умолчанию):

os.Stderr.Write(message)

Записать сообщение в stdout (более обычное место для записи выходных данных программы):

os.Stdout.Write(message)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...