golang 网络编程
TCP客户端
// tcp/client/main.go
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
// 客户端
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:9000")
if err != nil {
fmt.Println("err :", err)
return
}
defer conn.Close() // 关闭连接
inputReader := bufio.NewReader(os.Stdin)
for {
input, _ := inputReader.ReadString('\n') // 读取用户输入
inputInfo := strings.Trim(input, "\r\n")
if strings.ToUpper(inputInfo) == "Q" { // 如果输入q就退出
return
}
_, err = conn.Write([]byte(inputInfo)) // 发送数据
if err != nil {
return
}
buf := [512]byte{}
n, err := conn.Read(buf[:])
if err != nil {
fmt.Println("recv failed, err:", err)
return
}
fmt.Println(string(buf[:n]))
}
}
TCP服务端
// tcp/server/main.go
// TCP server端
package main
import (
"bufio"
"fmt"
"net"
)
// 处理函数
func process(conn net.Conn) {
defer conn.Close() // 关闭连接
for {
reader := bufio.NewReader(conn)
var buf [128]byte
n, err := reader.Read(buf[:]) // 读取数据
if err != nil {
fmt.Println("read from client failed, err:", err)
break
}
recvStr := string(buf[:n])
fmt.Println("收到client端发来的数据:", recvStr)
conn.Write([]byte(recvStr)) // 发送数据
}
}
func main() {
listen, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("listen failed, err:", err)
return
}
for {
conn, err := listen.Accept() // 建立连接
if err != nil {
fmt.Println("accept failed, err:", err)
continue
}
go process(conn) // 启动一个goroutine处理连接
}
}
TCP代理服务器
package main
import (
"flag"
"fmt"
"net"
"os"
)
func main() {
help := flag.Bool("help", false, "print usage")
bind := flag.String("bind", "127.0.0.1:8000", "The address to bind to")
backend := flag.String("backend", "", "The backend server address")
flag.Parse()
if *help {
flag.Usage()
return
}
if *backend == "" {
flag.Usage()
return
}
if *bind == "" {
//use default bind
}
success, err := RunProxy(*bind, *backend)
fmt.Println(err)
if !success {
os.Exit(1)
}
}
func RunProxy(bind, backend string) (bool, error) {
listener, err := net.Listen("tcp", bind)
if err != nil {
return false, err
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
} else {
go ConnectionHandler(conn, backend)
}
}
}
func ConnectionHandler(conn net.Conn, backend string) {
target, err := net.Dial("tcp", backend)
defer conn.Close()
if err != nil {
} else {
defer target.Close()
closed := make(chan bool, 2)
go Proxy(conn, target, closed)
go Proxy(target, conn, closed)
<-closed
}
}
func Proxy(from net.Conn, to net.Conn, closed chan bool) {
buffer := make([]byte, 4096)
for {
n1, err := from.Read(buffer)
if err != nil {
closed <- true
return
}
n2, err := to.Write(buffer[:n1])
fmt.Println(n2,err)
if err != nil {
closed <- true
return
}
}
}

浙公网安备 33010602011771号