Reputation: 93
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