```
func Socket(socketAddr string) {
fmt.Println("Launching server...", socketAddr)
// listen on all interfaces
ln, err := net.Listen("tcp", socketAddr)
if err != nil {
panic(err)
}
for {
// accept connection on port
conn, err := ln.Accept()
if err != nil {
panic(err)
}
go handleRequest(conn)
}
}
func handleRequest(conn net.Conn) {
defer conn.Close()
for {
r := bufio.NewReader(conn)
// will listen for message to process ending in newline (\n)
message, err := r.ReadString('\n')
fmt.Println(message)
if err != nil {
fmt.Println(err)
return
}
}
}
```
我使用一个socket接受数据,然后用\n切割数据的时候会有几率出现如图
![image.png](https://static.studygolang.com/171115/9bd7a4fbb0466bc11403c88ab3823501.png)
但是我写入文件的话就不会,如图
![image.png](https://static.studygolang.com/171115/a861ca230ea527544e5081411d9f8f26.png)
请问这个是什么问题?我查了一下,如果使用readline会有isPrefix这个参数,但是使用之后,发现返回的为false,也就说明没有出现阶段。。。
下面是bufio.Reader的代码,buffer是先读取不定字节后再查找delimiter的,所以每次ReadString返回之后buffer里面很大可能是还有剩余数据的,ReadString放在循环里的做法肯定是有问题的
// fill reads a new chunk into the buffer.
func (b *Reader) fill() {
// Slide existing data to beginning.
if b.r > 0 {
copy(b.buf, b.buf[b.r:b.w])
b.w -= b.r
b.r = 0
}
if b.w >= len(b.buf) {
panic("bufio: tried to fill full buffer")
}
// Read new data: try a limited number of times.
for i := maxConsecutiveEmptyReads; i > 0; i-- {
n, err := b.rd.Read(b.buf[b.w:])
if n < 0 {
panic(errNegativeRead)
}
b.w += n
if err != nil {
b.err = err
return
}
if n > 0 {
return
}
}
b.err = io.ErrNoProgress
}
https://github.com/golang/go/blob/master/src/bufio/bufio.go
#9
更多评论