Golang клиент не полностью считывает данные из conn.Read

263
26 сентября 2018, 15:20

Здраствуйте. Пытаюсь написать приложение, в котором клиент передает select запрос серверу, который в свою очередь связывается с БД и передает содержимое на клиент, проблема в том,что из четырех строк из БД при запросе сначала клиент получает 1ую строку, при повторном запросе остальные 3,потом уже все.

Клиент:

    package main
import (
    "bufio"
    "fmt"
    "io"
    "net"
    "os"
)
type product struct {
    id      int
    model   string
    company string
    price   int
}
func Scan2() (str string) {
    in := bufio.NewReader(os.Stdin)
    str, err := in.ReadString('\n')
    if err != nil {
        fmt.Println("Ошибка ввода: ", err)
    }
    return str
}
func readFromServer(conn net.Conn) (result []byte) {
    in := bufio.NewScanner(conn)
    in.Scan()
    if err := in.Err(); err != nil {
        fmt.Println("Ошибка ввода")
    }
    return in.Bytes()
}
func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:8080")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer conn.Close()
    for {
        fmt.Println("Введите SELECT запрос")
        res := Scan2()
        fmt.Println("Ваш SELECT запрос:", res)
        if n, err := conn.Write([]byte(res)); n == 0 || err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println("Результат SELECT запроса")
        buf := make([]byte, 1024)
        b, err := io.ReadFull(conn, buf)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(string(buf[:b]))
    }
}

Сервер:

    package main
import (
    "bufio"
    //"bytes"
    "database/sql"
    //"encoding/gob"
    "fmt"
    "net"
    "strconv"
    //"strings"
    //"time"
    _ "myprojects/github.com/go-sql-driver/mysql"
)
type product struct {
    id      int
    model   string
    company string
    price   int
}
func readFromClient(conn net.Conn) (result string) {
    in := bufio.NewScanner(conn)
    in.Scan()
    if err := in.Err(); err != nil {
        fmt.Println("Ошибка ввода")
    }
    return in.Text()
}
func main() {
    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer listener.Close()
    fmt.Println("Server is listening")
    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println(err)
            conn.Close()
            continue
        }
        go handleConnection(conn)
    }
}
func handleConnection(conn net.Conn) {
    defer conn.Close()
    for {
        result := readFromClient(conn)
        fmt.Println("Пришел запрос от клиента:")
        fmt.Println(result)
        db, err := sql.Open("mysql", "root:lobzik92@/productsDB")
        if err != nil {
            panic(err)
        }
        err = db.Ping()
        if err != nil {
            panic(err)
        }
        rows, err := db.Query(result)
        if err != nil {
            panic(err)
        }
        defer rows.Close()
        products := []product{}
        for rows.Next() {
            p := product{}
            err = rows.Scan(&p.id, &p.model, &p.company, &p.price)
            if err != nil {
                panic(err)
                continue
            }
            products = append(products, p)
            pid := strconv.Itoa(p.id)
            pprice := strconv.Itoa(p.price)
            resStr := pid + " " + p.model + " " + p.company + " " + pprice + "\n "
            fmt.Println("!!!!", resStr)
            conn.Write([]byte(resStr))
        }
READ ALSO
Ссылки меню отображаются не правильно

Ссылки меню отображаются не правильно

Ссылка на сайт http://netahakitk/

224
Как расширишь footer с помощью css (height-свойство)?

Как расширишь footer с помощью css (height-свойство)?

Footer хочу расширить именно с помощью свойства heightНе получается

251
Ошибка карты кода (bootstrap.js)

Ошибка карты кода (bootstrap.js)

Собираю все js скрипты в один

241