涉及知识
- golang的socket基本编程
- defer 的使用(nice)
- byte类型的使用
这是一个简单的golang socket应用demo
有两个程序, 分别是server和client, 功能是在client中输入字符串, 然后发送给server, server打印出来
server刚运行时阻塞监听client
然后启动某个client之后, server接受到一个连接
client中向server发送字符串
server成功接收
源代码
server.go
package main
// 聊天服务器
import (
"fmt"
"net" // 做 socket编程需要
)
func process(conn net.Conn) {
defer conn.Close()
for {
buf := make([]byte, 1024)
//fmt.Println("server waiting for client: " + conn.RemoteAddr().String())
n, err := conn.Read(buf)
if err != nil {
fmt.Println("server read err: ", err)
return
}
fmt.Println(string(buf[:n])) // 注意这里要切片 [:n], 不然会输出 1024个字节
}
}
func main() {
fmt.Println("开始监听...")
// 指定网络协议以及本地监听端口
listen, err := net.Listen("tcp", "0.0.0.0:8888")
if err != nil {
fmt.Println("listen error")
return
}
defer listen.Close()
for {
fmt.Println("waiting for client...")
conn, err := listen.Accept()
if err != nil {
fmt.Println("Accept err = ", err)
} else {
fmt.Println("Accept suc con = ", conn)
}
go process(conn)
}
}
client.go
package main
// 聊天客户端
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "localhost:8888")
if err != nil {
fmt.Println("error: ", err)
} else {
//fmt.Println("con: ", conn)
}
for {
// 从终端读取一行数据
reader := bufio.NewReader(os.Stdin)
line, err := reader.ReadString('\n')
if err != nil {
fmt.Println("readString err: ", err)
}
line = strings.Trim(line, " \r\n") // 小心返回之后要赋值
if line == "exit" {
fmt.Println("break")
return
}
_, err = conn.Write([]byte(line))
if err != nil {
fmt.Println("conn.Write err: ", err)
}
//fmt.Printf("客户端发送了 %d 字节的数据\n", n)
}
}