Здравствуйте, я внедрил сервер GO, который считывает данные с клиента и печатает его. Для чтения из сетевого потока, я читаю из метода conn.Read() на сервере.Сервер, не получающий данные от TCP-клиента в GO
Ниже мой код, чтобы прочитать байты из сетевого потока
// return a single byte after reading from buffer
func readByte(conn net.Conn,buf []byte,numberofbytes *int,bufCurrPos *int) (byte){
fmt.Printf("Byte read")
if *bufCurrPos == *numberofbytes {
for {
*bufCurrPos = 0
*numberofbytes,_ = conn.Read(buf)
if *numberofbytes ==0 {
continue
} else {
break
}
}
}
b := buf[*bufCurrPos]
*bufCurrPos++
return b
}
Теперь я создал два клиента, которые записывать данные на сервер.
Первый клиент записывается в поток с использованием метода conn.Write(), а второй метод записывается в поток с использованием метода fmt.Fprintf (bufio.NewWriter(), format string).
Client 1
conn, err := net.Dial("tcp","localhost:8080")
if err != nil {
checkError(err)
}
go readHandler(conn)
for {
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
conn.Write([]byte(text[0:len(text)-1]+"\r\n"))
}
клиент 2:
name := "hi.txt"
contents := "bye"
exptime := 300000
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
t.Error(err.Error()) // report error through testing framework
}
scanner := bufio.NewScanner(conn)
// Write a file
n,err := fmt.Fprintf(bufio.NewWriter(conn), "write %v %v %v\r\n%v\r\n", name, exptime, len(contents), contents)
if err !=nil {
fmt.Printf("error in writing in buffer\n")
}
Сервер считывает данные правильно с первым клиентом, но и для второго клиента, он просто прочитать 0 байт всегда.
Я начинаю в GO и не знаю причину этого. Может кто-нибудь, пожалуйста, помогите мне в этом
Понять, почему, как новичок вы можете начать писать 'readByte' с C-подобный интерфейс, который записывает изменения обратно через' Int * 'ы, но это сравнительно редко в Go. (Иногда люди используют несколько возвращаемых значений.) Для чтения байта, в частности, отметьте ['(* bufio.Reader) .ReadByte'] (https://godoc.org/bufio#Reader.ReadByte). (Кроме того, знайте, что это пример кода, но проверяйте ошибки! Пропуск проверки выглядит как ярлык до тех пор, пока в первый раз он не сможет найти ошибку, хех. [Errcheck] (http://github.com/kisielk/errcheck) или [gometalinter] (https://github.com/alecthomas/gometalinter) может помочь.) – twotwotwo