-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathmain.go
88 lines (73 loc) · 1.81 KB
/
main.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
// just for posix
package main
import (
"net"
"log"
"bufio"
"fmt"
"os/exec"
"strings"
"runtime"
)
func clientThread (conn net.Conn) {
defer conn.Close()
addStr := conn.RemoteAddr().String()
log.Println("client enter -> ", addStr)
cmd := exec.Command("bash")
var preader *bufio.Reader
var pwriter *bufio.Writer
{
w, _ := cmd.StdinPipe()
pwriter = bufio.NewWriter(w)
r, _ := cmd.StdoutPipe()
preader = bufio.NewReader(r)
}
cmd.Start()
sreader := bufio.NewReader(conn)
swriter := bufio.NewWriter(conn)
go func() {
for {
line, err := preader.ReadString('\n')
if err != nil { break }
swriter.WriteString(line)
swriter.Flush()
}
log.Println("client 2nd thread exit -> ", addStr)
}()
for {
line, err := sreader.ReadString('\n')
if err != nil {
log.Println("client read err", err, addStr)
break
}
line = strings.TrimSpace(line)
if line == "exit" { break }
line = strings.TrimSpace(line)
pwriter.WriteString(line + "\n")
pwriter.Flush()
}
pwriter.WriteString("exit\n")
pwriter.Flush()
log.Println("client leave -> ", addStr)
}
func serverThread() {
l, err := net.Listen("tcp", ":7000")
if err != nil { log.Fatalln("listen failed!") }
defer l.Close()
log.Println("listen -> ", l.Addr())
for {
conn, err := l.Accept()
if err != nil {
log.Println("accept failed ->", err)
continue
}
go clientThread(conn)
}
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
go serverThread()
fmt.Println("press any key to shutdown...")
input := ""
fmt.Scanf("%s", &input)
}