susanliu
susanliu

Reputation: 93

WriteString and ReadString in server and client in golang

I am implementing a simple server that can read the message send by the client one line at a time and prepend the line count to each line.

Here's my server.go file:

package main
import "fmt"
import "bufio"
import "net"
import "os"
import "strconv"

func check(e error) {
    if e != nil {
        panic(e)
    }
}
func main() {
    fmt.Println("Launching server...")
    ln, _ := net.Listen("tcp", ":12008")
    conn, _ := ln.Accept()
    defer ln.Close()
    defer conn.Close()

    outputFile, errOutput := os.Create("whatever.txt")
    check(errOutput)
    defer outputFile.Close()

    filewriter := bufio.NewWriter(outputFile)
    reader := bufio.NewReader(conn)
    length, errr := reader.ReadString('\n')
    check(errr)
    fmt.Printf("Upload file size: %s", length)
    i:=1
    for{
        line, err := reader.ReadString('\n')
        if err != nil {
            break
        }
        filewriter.WriteString(strconv.Itoa(i)+" "+line+"\n")
        i++
    }
    filewriter.Flush()
    writer := bufio.NewWriter(conn)
    fileStat,e := outputFile.Stat()
    check(e)
    fmt.Printf("Output file size: %s\n", fileStat.Size())
    newline := fmt.Sprintf("%s bytes received, %d bytes file generated\n", length,fileStat.Size())
    _, errw := writer.WriteString(newline)
    check(errw)
    writer.Flush()
}

In the for loop, it reads the message with reader.ReadString() one line at a time until the error(no more line to read) is null. When I run the code, it was stuck here, it seems that the for loop didn’t break as I am expecting, so I guess here is where the problem occur, but I don't know how to fix it.

Here's my client.go:

package main
import "fmt"
import "os"
import "bufio"
import "net"
import "strconv"

func check(e error) {
    if e != nil {
        panic(e)
    }
}
func main() {
    conn, errc := net.Dial("tcp", "127.0.0.1:12008")
    check(errc)
    defer conn.Close()
    inputFileName:=""
    fmt.Printf("Input filename: ")
    fmt.Scanf("%s\n", &inputFileName)
    inputFile,errInput:= os.Open(inputFileName)
    check(errInput)
    defer inputFile.Close()
    inputstat,err:=inputFile.Stat()
    check(err)

    writer := bufio.NewWriter(conn)
    fmt.Printf("Send the file size first: %d \n", inputstat.Size())
    _, errw := writer.WriteString(strconv.FormatInt(inputstat.Size(), 10)+"\n")
    check(errw)

    fileScanner := bufio.NewScanner(inputFile)
    for fileScanner.Scan() {
        writer.WriteString(fileScanner.Text()+"\n")
    }
    writer.Flush()
    scanner := bufio.NewScanner(conn)
    if scanner.Scan() {
        fmt.Printf("Server replies: %s\n", scanner.Text())
    }
}

In my client, it reads the file one line at a time and send the line to the server. I guess the problem is not in the client part because it worked with the server my teacher implemented. I want to know what's the problem with my server.go. Thanks!

Upvotes: 0

Views: 79

Answers (0)

Related Questions