2016-01-20 2 views
0

Здравствуйте, я внедрил сервер 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 и не знаю причину этого. Может кто-нибудь, пожалуйста, помогите мне в этом

+1

Понять, почему, как новичок вы можете начать писать '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

ответ

2

Приложение client2 должно flush буфер.

bw := bufio.NewWriter(conn) 
n,err := fmt.Fprintf(bw, "write %v %v %v\r\n%v\r\n", name, exptime, len(contents), contents) 
bw.Flush() 

Приложение должно также проверять ошибки.

bw := bufio.NewWriter(conn) 
_, err := fmt.Fprintf(bw, "write %v %v %v\r\n%v\r\n", name, exptime, len(contents), contents) 
if err != nil { 
    // handle error 
} 
if err := bw.Flush(); err != nil { 
    // handle error 
} 

fmt.Fprintf буферы внутри. Если это единственная запись в соединение, удалите буферизованный писатель.

_, err := fmt.Fprintf(conn, "write %v %v %v\r\n%v\r\n", name, exptime, len(contents), contents) 
if err != nil { 
    // handle error 
} 
Смежные вопросы