Здраствуйте. Пытаюсь написать приложение, в котором клиент передает 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))
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости