2016-01-20 121 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(),格式字符串)方法写入流。

客户端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的begginer,不知道原因。 请问有人请帮我

+1

了解为什么作为初学者,您可能会开始用类似C的接口编写'readByte',通过'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 
} 
相关问题