-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathserver.go
executable file
·123 lines (111 loc) · 2.75 KB
/
server.go
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
112
113
114
115
116
117
118
119
120
121
122
123
package main
import (
"io";
"net";
"fmt";
"strings";
"time";
"regexp";
)
type TClient struct {
local string;
forserver string;
msg string;
}
type SFile struct {
local string;
name string;
}
func myReader(conn *net.TCPConn, client chan TClient) {
var rcvStr string;
var localAddr string;
for {
rcvStr = "";
read := true;
for read {
rcvd := make([]byte, 1);
size, err := conn.Read(rcvd);
switch err {
case io.EOF:
//log.Stdout("Warning: End of data reached: ", err);
read = false
case nil:
if (string(rcvd[0:1]) == "\n") {
read = false
} else {
rcvStr = rcvStr + string(rcvd[0:size])
}
default:
fmt.Println("Error: Reading data: ", err);
read = false;
}
if (string(rcvd[0:1])== "\n") {
read = false
}
}
if regexp.MustCompile("^I'm").MatchString(rcvStr) {
ladr, _ := net.ResolveTCPAddr("tcp", strings.Split(rcvStr, " ")[1]);
localAddr = ladr.String();
fmt.Println(localAddr);
client <- TClient{localAddr, conn.RemoteAddr().String(), "new"};
} else {
if len(rcvStr) > 0 {
client <- TClient{localAddr, conn.RemoteAddr().String(), rcvStr};
fmt.Println("Data sent by client: " + rcvStr);
}
time.Sleep(5 * 1000 * 1000);
}
}
}
func ProcessConn(conn *net.TCPConn, client chan TClient) {
fmt.Println("connected\n");
//get client's ip and port
conn.Write([]byte("hi"));
go myReader(conn, client);
}
func ListenConnections(listener *net.TCPListener, connections chan *net.TCPConn, clients chan TClient) {
for {
conn, err := listener.AcceptTCP();
if err != nil {
fmt.Println("error in Accept():", err)
} else {
conn.SetKeepAlive(true);
conn.SetReadDeadline(time.Now().Add(10 * time.Second));
go ProcessConn(conn, clients);
connections <- conn;
}
}
}
func main() {
addr, err := net.ResolveTCPAddr("tcp","127.0.0.1:4009");
if err != nil {
fmt.Println("error:", err)
}
listener, err := net.ListenTCP("tcp", addr);
if err != nil {
fmt.Println("error", err)
}
//1 channel for incoming connections, another for client communication
connections := make(chan *net.TCPConn);
clients := make(chan TClient);
cMap := make(map[string]*net.TCPConn);
fMap := make(map[string]string);
go ListenConnections(listener, connections, clients);
fmt.Println("Waiting for connections\n");
for {
select {
case conn := <-connections:
cMap[conn.RemoteAddr().String()] = conn
case client := <-clients:
if regexp.MustCompile("^have ").MatchString(client.msg) {
fMap[string(client.msg[5:len(client.msg)])] = client.local
}
if regexp.MustCompile("^list").MatchString(client.msg) {
for key, value := range fMap {
cMap[client.forserver].Write([]byte(key + "->" + value))
}
cMap[client.forserver].Write([]byte("\n"));
}
}
}
}