ReadString 读取 EOF 时如何打破循环?

How to break the loop when ReadString read EOF?

提问人:Karen0104 提问时间:11/5/2021 更新时间:11/5/2021 访问量:325

问:

我正在为服务器和客户端编写简单的代码,这是服务器部分。我想一次从套接字中读取一行消息并将其写入 newfile。但是,如果代码读取 EOF,则代码将停止运行。我想知道如何打破循环并继续运行下面的代码。 谢谢!

package main

import "fmt"
import "bufio"
import "net"
import "os"
import "log"
//import "strings" 


func check(e error) {
   if e != nil {
   panic(e) 
   }
}

func main() {
   fmt.Println("Launching server...")
   ln, _ := net.Listen("tcp", ":12003") 
   conn, _ := ln.Accept()
   defer ln.Close()
   defer conn.Close()

   //read file size(string)
   reader1 := bufio.NewReader(conn) 
   m_size, err1 := reader1.ReadString('\n')  
   check(err1)

   //print file size
   fmt.Printf("Upload file size: %s", m_size)

   //create new file
   out_file := "whatever.txt"
   newfile, err2 := os.Create(out_file) 
   check(err2)
   defer newfile.Close()


   //read and write line to new file
   writer1 := bufio.NewWriter(newfile)
   var i = 1
   line, err3 := reader1.ReadString('\n')
   check(err3)
   for err3 == nil {
       writer1.WriteString(fmt.Sprintf("%d %s", i, line)) 
       line, err3 = reader1.ReadString('\n')
       if err3 != nil { 
         break
       }
       i += 1
   }
   writer1.Flush()
   
   // get the new file's size and print
   stats, errr := os.Stat(out_file)
   if errr != nil {
      log.Fatal(errr)
   }
   fmt.Printf("Output file size: %d\n", stats.Size())

   // send message back to client
   writer2 := bufio.NewWriter(conn)
   m_size = strings.Replace(m_size, "\n", "", -1)
   newline := fmt.Sprintf("%s bytes received, %d bytes file generated",m_size,stats.Size()) 
   _, errw := writer2.WriteString(newline)
   check(errw)
   writer2.Flush()
}
循环 go 服务器 eof

评论

0赞 Dylan Reimerink 11/5/2021
据我所知,如果返回一个 EOF,它应该打破 for 循环并继续运行代码。“但是如果读取 EOF,代码将停止运行”是什么意思?它会在其他地方恐慌吗?line, err3 = reader1.ReadString('\n')
0赞 JimB 11/5/2021
尝试处理错误是一种糟糕的模式,特别是因为您将它与内联错误检查混合在一起;维护一致处理错误的代码会更容易。这也是一个笨拙的实现,所以使用它可能会导致更清晰的代码,你可以更容易地找到你的错误。check(error)bufio.Scanner
0赞 Karen0104 11/5/2021
(1)循环正常运行,直到文件结束,它停止工作并且不输入“if”部分也不打印任何内容。之后,我强制客户端停止运行,这里的服务器将在终端上显示“EOF”并完成以下代码。(2) 我试过 bufio。扫描仪已经,但它没有从套接字扫描任何内容。

答: 暂无答案