Skip to content

Instantly share code, notes, and snippets.

@reterVision
Last active February 26, 2018 06:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save reterVision/006147d5d63345f11060 to your computer and use it in GitHub Desktop.
Save reterVision/006147d5d63345f11060 to your computer and use it in GitHub Desktop.
Passing file with gob.
package main
import (
"bufio"
"encoding/gob"
"log"
"net"
"os"
)
const CONN_TYPE = "tcp"
type NormalFile struct {
Data *[]byte
}
func main() {
if len(os.Args) < 3 {
log.Fatal("Usage: go run client_gob.go 127.0.0.1:8080 filename")
}
serverAddr := os.Args[1]
filename := os.Args[2]
inputFile, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
defer inputFile.Close()
fileStat, err := inputFile.Stat()
if err != nil {
log.Fatal(err)
}
// Read file content
fileLength := fileStat.Size()
dataBuffer := make([]byte, fileLength)
r := bufio.NewReader(inputFile)
n, err := r.Read(dataBuffer)
if int64(n) != fileLength {
log.Fatal("Cannot read full file")
}
// Connect to server and pass file
tcpAddr, err := net.ResolveTCPAddr(CONN_TYPE, serverAddr)
if err != nil {
log.Fatal(err)
}
conn, err := net.DialTCP(CONN_TYPE, nil, tcpAddr)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
encBuf := bufio.NewWriter(conn)
encoder := gob.NewEncoder(encBuf)
err = encoder.Encode(NormalFile{&dataBuffer})
if err != nil {
log.Fatal(err)
}
reply := make([]byte, 1024)
_, err = conn.Read(reply)
if err != nil {
log.Fatal(err)
}
log.Print(string(reply))
}
package main
import (
"bufio"
"encoding/gob"
"fmt"
"log"
"net"
"os"
"time"
)
type NormalFile struct {
Data *[]byte
}
const (
CONN_HOST = ""
CONN_PORT = "8080"
CONN_TYPE = "tcp"
)
func main() {
// Listen for incoming connections
l, err := net.Listen(CONN_TYPE, CONN_HOST+":"+CONN_PORT)
if err != nil {
panic(err)
}
defer l.Close()
log.Print("Listening on ", CONN_HOST+":"+CONN_PORT)
for {
conn, err := l.Accept()
log.Print("Accepted one connection")
if err != nil {
panic(err)
}
go handleRequest(conn)
}
}
func handleRequest(conn net.Conn) {
defer conn.Close()
filename := fmt.Sprintf("code%d.tar.gz", time.Now().Unix())
fo, err := os.Create(filename)
if err != nil {
log.Print("Create file error")
return
}
defer fo.Close()
decBuf := bufio.NewReader(conn)
decoder := gob.NewDecoder(decBuf)
var codeFile NormalFile
err = decoder.Decode(&codeFile)
if err != nil {
log.Fatal(err)
}
fo.Write(*codeFile.Data)
conn.Write([]byte("File received."))
log.Print("File received completely")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment