最近开始学习golang,发现确实很给力,写了一个回射服务器代码,了解到可以阻塞读数据,也可以借助bufio中的**NewScanner**,我理解这是一个扫描器,用法也大概研究了一下,结果写完代码在linux上没有问题,运行正常,在windows却不能收到客户端数据,希望高手指点一二!
服务器启动后,通过客户端测试,效果如下:
![image.png](https://static.studygolang.com/171230/c99e4436e4d981a9504b1db8ec1d1926.png)
源代码如下:
``` go
//回响服务器
package main
import (
"time"
"fmt"
"log"
"net"
"bufio"//提供扫描器
"strings"
)
func main(){
//首先要创建链接侦听器
listener,err := net.Listen("tcp",":8080")
if err != nil {
log.Fatal(err)//会执行exit
}
//执行结束自动释放
defer listener.Close()
//循环等待客户端连接
for {
conn,err := listener.Accept()
if err != nil {
fmt.Println(err)
continue
}
go handleconn(conn)
}
}
//用于和客户端通信
func handleconn(conn net.Conn){
defer conn.Close()
fmt.Println("begin handleconn...\n")
//获得一个扫描器,监控客户端是否输入数据
input := bufio.NewScanner(conn)
for input.Scan(){//会阻塞等待客户端数据到来
echo(conn,input.Text(),time.Second*1)
}
fmt.Println("end handleconn...\n")
}
//回响三声
func echo(conn net.Conn,msg string,deley time.Duration){
fmt.Fprintln(conn,strings.ToUpper(msg))
time.Sleep(deley)
fmt.Fprintln(conn,msg)
time.Sleep(deley)
fmt.Fprintln(conn,strings.ToLower(msg))
}
```
<a href="/user/leavesdrift" title="@leavesdrift">@leavesdrift</a> 按道理跨平台性应该在内部会处理不同平台的机制。。
#2
更多评论
应该不是这个问题之前欠考虑,因为不管是 "\r\n" 还是 '\n', scanner默认使用bufio.ScanLines的话以'\n'做区分都还是能分开数据的,你可以先试下不使用这个工具直接在终端启动server端和client端看能收到么,我用你的代码,客户端发信息服务端是收得到的
#3