- 論壇徽章:
- 36
|
回復(fù) 47# yulihua49
golang這種語言級(jí)實(shí)現(xiàn)的并發(fā)協(xié)程才好用,不需要去做任務(wù)線程、隊(duì)列、回調(diào)之類的
傳統(tǒng)的進(jìn)程池、線程池調(diào)度開銷大,goroutine開銷小得多,就可以搞成池,比如
每個(gè)連接一個(gè)goroutine,然后1對(duì)1的的處理,可以寫線性代碼了
隨便搜了兩段:
- //server.go
- package main
- import (
- "fmt"
- "net"
- )
- const (
- //綁定IP地址
- ip = "127.0.0.1"
- //綁定端口號(hào)
- port = 3333
- )
- func main() {
- listen, err := net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP(ip), port, ""})
- if err != nil {
- fmt.Println("監(jiān)聽端口失敗:", err.Error())
- return
- }
- fmt.Println("已初始化連接,等待客戶端連接...")
- Server(listen)
- }
- func Server(listen *net.TCPListener) {
- for {
- conn, err := listen.AcceptTCP()
- if err != nil {
- fmt.Println("接受客戶端連接異常:", err.Error())
- continue
- }
- fmt.Println("客戶端連接來自:", conn.RemoteAddr().String())
- defer conn.Close()
- go func() {
- data := make([]byte, 10)
- for {
- i, err := conn.Read(data)
- fmt.Println("客戶端發(fā)來數(shù)據(jù):", string(data[0:i]))
- if err != nil {
- fmt.Println("讀取客戶端數(shù)據(jù)錯(cuò)誤:", err.Error())
- break
- }
- if string(data[:i]) == "exit" {
- conn.Write([]byte{'e', 'x', 'i', 't'})
- conn.Close()
- break
- }
- conn.Write(data[0:i])
- }
- }()
- }
- }
復(fù)制代碼- //client.go
- package main
- import (
- "fmt"
- "net"
- )
- const (
- addr = "127.0.0.1:3333"
- )
- func main() {
- conn, err := net.Dial("tcp", addr)
- if err != nil {
- fmt.Println("連接服務(wù)端失敗:", err.Error())
- return
- }
- fmt.Println("已連接服務(wù)器")
- defer conn.Close()
- Client(conn)
- }
- func Client(conn net.Conn) {
- sms := make([]byte, 1024)
- for {
- fmt.Print("請(qǐng)輸入要發(fā)送的消息:")
- _, err := fmt.Scan(&sms)
- if err != nil {
- fmt.Println("數(shù)據(jù)輸入異常:", err.Error())
- }
- conn.Write(sms)
- buf := make([]byte, 1024)
- c, err := conn.Read(buf)
- if err != nil {
- fmt.Println("讀取服務(wù)器數(shù)據(jù)異常:", err.Error())
- }
- fmt.Println(string(buf[0:c]))
- }
- }
復(fù)制代碼 |
|