简体   繁体   English

服务器未从GO中的TCP客户端接收数据

[英]Server not receiving Data from TCP Client in GO

Hello I have implemented a server in GO which reads data from a client and print it. 您好,我在GO中实现了一个服务器,该服务器从客户端读取数据并进行打印。 For reading from the network stream, I am reading from the conn.Read() method on server. 为了读取网络流,我正在读取服务器上的conn.Read()方法。

Below is my code to read a byte from network stream 下面是我从网络流中读取一个字节的代码

// 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
}

Now I have created two client which write data to server. 现在,我创建了两个将数据写入服务器的客户端。

First Client write to the stream using conn.Write() method while second method write to the stream using fmt.Fprintf(bufio.NewWriter(),format string) method. 第一个客户端使用conn.Write()方法写入流,而第二个方法使用fmt.Fprintf(bufio.NewWriter(),format string)方法写入流。

Client 1 客户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"))
}

client 2 : 客户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")
        }

Server read the data properly with first client but for the second client, it just read 0 byte always. 服务器使用第一个客户端正确读取数据,但是对于第二个客户端,它始终始终读取0字节。

I am begginer in GO and don't know the reason for that. 我是GO的初学者,不知道其原因。 Could somebody please help me in that 有人可以帮我吗

The client2 application must flush the buffer. client2应用程序必须刷新缓冲区。

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()

The application should also check errors. 该应用程序还应该检查错误。

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 buffers internally. fmt.Fprintf内部缓冲。 If this is the only write to the connection, then remove the buffered writer. 如果这是对连接的唯一写入,则删除缓冲的写入器。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM