server.go
package main
import (
"fmt"
"net" // socket開發時很重要
)
func Process(conn net.Conn){
// 循環接收客戶端發送的數據
client := conn.RemoteAddr().String()// 客戶端IP:port
defer conn.Close()// 關閉conn
for{
// 創建一個新的切片
buf := make([]byte, 1024)
// fmt.Printf("服務器在等待客戶端%s發送信息\n", conn.RemoteAddr().String())
n, err := conn.Read(buf)// 從conn中讀取
// 等待客戶端通過conn發送信息,
// 如果客戶端沒有發送(write),就會阻塞在這里
if err!=nil{
// 一般為這個err
fmt.Printf("客戶端%s已退出..\n", client)
return
}
// 顯示客戶端發送的內容到服務器的終端
fmt.Printf("%s: %s", client, string(buf[:n]))// 讀到了n個數據
}
}
func main(){
fmt.Println("服務器開始監聽...")
// tcp表示使用的網絡協議
// 127.0.0.1:8888表示監聽的IP:port
listen, err := net.Listen("tcp", "127.0.0.1:8888")
if err!=nil{
fmt.Println("listen err =", err)
return
}
defer listen.Close()// 延時關閉listen
fmt.Println("listening success:", listen.Addr())
// 循環等待客戶端來連接
fmt.Println("等待客戶端來連接..")
for{
conn, err := listen.Accept()
if err!=nil{
fmt.Println("Accept() err =", err)
}else{
fmt.Printf("客戶端%s已連接..\n", conn.RemoteAddr().String())
}
// 准備一個協程,為客戶端服務
go Process(conn)
}
}
client.go
package main
import (
"fmt"
"net"
"bufio"
"os"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8888")
if err!=nil{
fmt.Println("client dial err =", err)
return
}
defer conn.Close()// 關閉連接
// 客戶端發送單行數據,然后就退出
reader := bufio.NewReader(os.Stdin)// 標准輸入(終端)
for{
// 從終端讀取一行用戶輸入,並發送給服務器
fmt.Print(">")
line, err := reader.ReadString('\n')
if err!=nil{
fmt.Println("reading string err =", err)
}
// 如果用戶輸入的是exit,客戶端就退出
line = strings.Trim(line, "\r\n")
if line=="exit"{
return
}
// 再將line發送給服務器
_, err = conn.Write([]byte(line+"\n"))
if err!=nil{
fmt.Println("conn write err =", err)
}
// fmt.Printf("客戶端發送了%d字節", n)
}
效果
服務端

客戶端
