【请教】socket客户端conn.Write()发送的内容末尾加上\n就能得到server端回应,否则超时,请帮忙看看是客户端还是server端问题,先谢谢了

jimyokl · 2017-09-26 05:57:03 · 1379 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-09-26 05:57:03 的主题,其中的信息可能已经有所发展或是发生改变。

客户端建立连接:

conn, err := net.DialTimeout("tcp", destIPPort, 3*time.Second)
if err != nil {
    Log(LL_INFO, "tcp connect error bef process log file, please check it.")
    return err
}
defer func() {
    if nil != conn {
        conn.Close()
    }
}()

客户端发送和接收:

scanner := bufio.NewScanner(file)
for scanner.Scan() {                
    line := scanner.Text()        
    index := strings.Index(line, "=")
    index = index + 1
    req := line[index:]
    //req = req + "\n"    //4post
    reqSent := []byte(req)                
    numSent, err := conn.Write(reqSent)
    ... //对err和numSent的异常处理
    conn.SetReadDeadline(time.Now().Add(3 * time.Second))
    numRecv, err := conn.Read(buff)
    if err != nil || numRecv < 0 {
        if err == io.EOF || err == syscall.EINVAL {                    
            Log(LL_INFO, "tcp connect is already closed.")
            return err
        }
        if 0 == numRecv {
            if nil != conn {
                conn.Close()
            }
            Log(LL_INFO,"4_post_log, err and numRecv: ", err, " . numRecv: ", numRecv)
            conn, err = net.DialTimeout("tcp", destIPPort, 6*time.Second)
            if err != nil {                        
                Log(LL_INFO, "tcp connect error:", err, ", please check it.")
                return err
            }                
        }else{                
            Log(LL_INFO, "tcp receive data error:", err, ", please check it.")
            return err
        }
    }
    Log(LL_INFO, "recv data:", string(buff[0:numRecv]))                            
}

server对端处理连接代码(echo发送收到的内容回去给客户端):

func handleConn(c net.Conn) {
    input := bufio.NewScanner(c)
    for input.Scan() {        
        lineRecv := input.Text()
        fmt.Println(lineRecv)
        fmt.Fprintln(c, lineRecv)        
    }
    c.Close()
}

如果我把“req = req + "\n"”这行注释掉,不加\n在末尾,则报错:

2017-09-26 13:36:03 <LL_INFO> 4_post_log, err and numRecv: read tcp 127.0.0.1:51863->127.0.0.1:12345: i/o timeout . numRecv: 0

如果在末尾加上“\n",则能收到server端echo回来的数据(如下是日志):

2017-09-26 13:53:12 <LL_INFO> Data sent:hnd {1}
Total sent 8bytes.
2017-09-26 13:53:12 <LL_INFO> Data sent finished, begin to recv...
2017-09-26 13:53:12 <LL_INFO> recv data:hnd {1}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1379 次点击  
加入收藏 微博
5 回复  |  直到 2017-09-26 09:56:55
channel
channel · #1 · 8年之前

不加 \n 不知道什么时候结束读取?

jimyokl
jimyokl · #2 · 8年之前

谢谢 channel 回复

jimyokl
jimyokl · #3 · 8年之前

不加\n收不到数据

2017-09-26 14:10:17  Data sent:hnd {1}Total sent 7bytes.
2017-09-26 14:10:17  Data sent finished, begin to recv...
2017-09-26 14:10:20  4_post_log, err and numRecv: read tcp 127.0.0.1:35623->127.0.0.1:12345: i/o timeout . numRecv: 0
2017-09-26 14:10:23  recv data:
abin
abin · #4 · 8年之前

bufio.NewScanner创建的Scanner默认的分割函数是ScanLines,而ScanLines需要一个必选换行符参考标准库中文版 参考标准库英文文版

jimyokl
jimyokl · #5 · 8年之前

谢谢 abin的回复

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传