利用golang通道優化TCP Socket伺服器

2021-08-28 03:29:53 字數 1156 閱讀 8970

前面的幾篇文章分別介紹了udp和tcp進行socket程式設計的方法,在tcp的文章中,我們除了傳統的阻塞型伺服器,還給出了多執行緒伺服器的實現方式。今天我們利用golang的通道,給出一種更加高效的伺服器設計。

package main

import (

"fmt"

"net"

"os"

"strconv"

"strings"

"go-study/socket/config"

)func main()

defer listener.close()

for

go handleconn(conn)

}}

main函式的部分和之前的tcp伺服器基本相同,目前還看不出什麼差別,主要是執行listen和accept,當有客戶端連線時,將連線交給handleconn協程處理。大家或許猜到了,差別就在handleconn上面。

func handleconn(conn net.conn) 

} }}

func readconn(conn net.conn, readchan chan

strdata := string(data)

fmt.println("received:", strdata)

readchan

} stopchan

}func writeconn(conn net.conn, writechan

fmt.println("send:", strdata)

} stopchan

}

readconn和writeconn就是把之前的讀寫操作分為了兩個協程,readconn協程會阻塞在read函式,直到網路上有資料可讀,通過readchan傳送讀到的字串,writeconn協程會阻塞在讀取writechan,直到在handleconn中向writechan寫入資料。

通過使用通道和select,golang構造出了很好的非同步io機制,我們不需要等待任何的讀寫操作,只是在需要執行的時候,程式才會執行。避免了不必要的cpu消耗。

Golang 關於通道 Chan 詳解

首先我們來看執行緒,在golang裡面也叫goroutine 下面我們先來看乙個例子吧 import fmt funcmain 在golang裡面,使用go這個關鍵字,後面再跟上乙個函式就可以建立乙個執行緒。後面的這個函式可以是已經寫好的函式,也可以是乙個匿名函式 funcmain i fmt.pr...

Golang 關於通道 Chan 詳解

首先我們來看執行緒,在golang裡面也叫goroutine 在讀這篇文章之前,我們需要了解一下併發與並行。golang的執行緒是一種併發機制,而不是並行。它們之間的區別大家可以上網搜一下,網上有很多的介紹。下面我們先來看乙個例子吧 import fmt funcmain 在golang裡面,使用g...

golang帶緩衝的通道

go通道緩衝 使我們可以非同步的讀寫通道 預設情況下 通道是不帶緩衝的 傳送端傳送資料 同時必須又接收端相應的接收資料 而帶緩衝區的通道則允許傳送端的資料傳送和接收端的資料獲取處於非同步狀態 就是說傳送端傳送的資料可以防範緩衝區裡面 可以等待接收端取獲取資料 而不是立刻需要接收端去獲取資料 不過由於...