-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.go
More file actions
111 lines (98 loc) · 2.38 KB
/
client.go
File metadata and controls
111 lines (98 loc) · 2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package main
import (
"bufio"
"fmt"
"io"
"log"
"os"
"strconv"
"strings"
"golang.org/x/net/websocket"
)
func main() {
ws, err := websocket.Dial("ws://localhost:8000/ws", "", "http://localhost/")
if err != nil {
log.Fatal("Dial error:", err)
}
defer ws.Close()
consoleReader := bufio.NewReader(os.Stdin)
// Send username
log.Print("Enter username: ")
username, err := consoleReader.ReadString('\n')
if err != nil {
fmt.Println("Error reading username:", err)
return
}
websocket.Message.Send(ws, fmt.Sprintf(username))
// Recieve Messages
go func() {
for {
var msg string
if err = websocket.Message.Receive(ws, &msg); err != nil {
log.Println("Server closed connection")
return
}
if strings.HasPrefix(msg, "FILE:") {
parts := strings.Split(msg, ":")
filename, sizeStr, recieverID := parts[1], parts[2], parts[3]
size, _ := strconv.ParseInt(sizeStr, 10, 64)
fmt.Printf("Recieving file from %s \n filename: %s, size: %d", recieverID, filename, size)
fileData := make([]byte, size)
if err := websocket.Message.Receive(ws, &fileData); err != nil {
fmt.Printf("Error recieving file: %v", err)
return
}
file, err := os.Create(recieverID + "-" + filename)
if err != nil {
fmt.Println("Error creating file:", err)
return
}
file.Write(fileData)
file.Close()
} else {
fmt.Println(msg)
}
}
}()
// Handle User Input
for {
text, err := consoleReader.ReadString('\n')
if err != nil {
if err == io.EOF {
log.Println("Input closed")
} else {
log.Println("Input error: ", err)
}
return
}
switch {
case strings.HasPrefix(text, "/file"):
// /file:filename:user -> FILE:filename:size:user
parts := strings.Split(text, ":")
filename, recieverID := parts[1], parts[2]
// Read File
file, err := os.Open(filename)
if err != nil {
log.Println("Error reading file:", err)
continue
}
defer file.Close()
// Inform the server
size, _ := file.Stat()
_, err = fmt.Fprintf(ws, "FILE:%s:%d:%s\n", filename, size.Size(), recieverID)
if err != nil {
log.Println("Write error:", err)
return
}
// Send the File
if _, err = io.Copy(ws, file); err != nil {
fmt.Println("Error sending file:", err)
}
default:
if err := websocket.Message.Send(ws, text); err != nil {
fmt.Println("Write error:", err)
continue
}
}
}
}