GO語言初級學(xué)習(xí)之代碼案例10 (TCP并發(fā)服務(wù)器&并發(fā)客戶端)

@(go語言 黑馬)[GO語言]

簡單版TCP服務(wù)器

  • 題目:搭建一個(gè)簡單版TCP服務(wù)器
  • 知識點(diǎn):TCP通信
  • 邏輯:

_1. 創(chuàng)建服務(wù)器的IP+port(端口號)
_2. 創(chuàng)建通信socket
_3. 讀寫客戶端數(shù)據(jù)

  • 代碼如下
package main

import "fmt"

func main() {
    listener, err := net.Listen("tcp", ":8000") //創(chuàng)建服務(wù)器的IP+port(端口號)
    if err != nil {
        fmt.Println("Listen err:", err)
        return
    }
    defer listener.Close() //不要忘了結(jié)束關(guān)閉

    conn, err := listener.Accept() //conn是與客戶端通信的socket诗充,用于接收和發(fā)送數(shù)據(jù)
    fmt.Println("成功連接!")
    if err != nil {
        fmt.Println("Accept err:", err)
        return
    }

    //讀取客戶端發(fā)來的請求
    buf := make([]byte, 4096)

    n, err := conn.Read(buf)
    if n == 0 {
        return
    }
    if err != nil {
        fmt.Println("conn.Read err:", err)
        return
    }
    fmt.Println("收到客戶端的請求:", string(buf[:n]))
    conn.Write([]byte(strings.ToUpper(string(buf[:n])))) //處理數(shù)據(jù),并返回給客戶端峦睡,ToUpper()是轉(zhuǎn)大寫的意思
}

簡單版TCP客戶端

  • 題目:搭建一個(gè)簡單版TCP客戶端
  • 知識點(diǎn):TCP通信
  • 邏輯:

_1. 與服務(wù)器建立連接
_2. 發(fā)送請求
_3. 接收客戶端數(shù)據(jù)

  • 代碼如下
package main

import "fmt"

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:8000")//建立連接
    if err != nil {
        fmt.Println("net.Dial err:", err)
        return
    }

    conn.Write([]byte("Are you ready?"))//發(fā)送請求

    buf := make([]byte, 4096)
    n, err01 := conn.Read(buf)//讀取服務(wù)器回發(fā)的數(shù)據(jù)
    if err01 != nil {
        fmt.Println("conn.Read err:", err01)
        return
    }
    fmt.Println("讀到服務(wù)器發(fā)送的數(shù)據(jù):", string(buf[:n]))
}

并發(fā)服務(wù)器

  • 題目:搭建一個(gè):可以連接多個(gè)客戶端宴合,能夠重復(fù)與每個(gè)客戶端通信瞎饲,并且能夠識別客戶端發(fā)送的exit請求的服務(wù)器
  • 知識點(diǎn):TCP通信值漫,go并發(fā)
  • 邏輯:

_1. 寫出單個(gè)通信服務(wù)器
_2. 完善重復(fù)通信功能
_3. 完善連接多個(gè)客戶端功能

  • 代碼如下
package main

import "fmt"

func main() {
    listener, err := net.Listen("tcp", "127.0.0.1:8001")
    if err != nil {
        fmt.Println("net.Listen err:", err)
        return
    }
    defer listener.Close()

    for {
        fmt.Println("等待客戶端連接...")
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("listener.Accept err:", err)
            return
        }
        go commu(conn)
    }
}
func commu(conn net.Conn)  {
    defer conn.Close()
    for {
        buf := make([]byte, 4096)
        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println("conn.Read err:", err)
            return
        }
        if string(buf[:n]) == "exit\n" || string(buf[:n]) == "exit\r\n" {
            fmt.Println("客戶端請求斷開")
            return
        }
        if n == 0 {
            return
        }
        fmt.Println("讀到客戶端請求:", string(buf[:n]))

        conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
    }
}

并發(fā)客戶端

  • 題目:搭建一個(gè):能夠不斷地向服務(wù)器發(fā)送請求伯诬,每發(fā)送一次請求讀取回復(fù)一次晚唇,能夠判斷出客戶端是否關(guān)閉的客戶端
  • 知識點(diǎn):TCP通信,go并發(fā)
  • 邏輯:

_1. 寫出簡單版服務(wù)器
_2. 完善重復(fù)通信功能
_3. 完善識別服務(wù)器是否關(guān)閉功能

  • 代碼如下
package main

import "fmt"


func main() {
    conn,err:=net.Dial("tcp","127.0.0.1:8001")
    if err != nil {
        fmt.Println("net.Dial err:", err)
        return
    }
    defer conn.Close()

    for {
        buf := make([]byte, 4096)
        n, err := os.Stdin.Read(buf)
        if err != nil {
            fmt.Println("os.Stdin.Read err:", err)
            return
        }

        conn.Write([]byte(string(buf[:n])))

        sli := make([]byte, 4096)
        n, err = conn.Read(sli)
        if err != nil {
            fmt.Println("conn.Read err:", err)
            return
        }
        if n == 0 {
            fmt.Println("檢測到服務(wù)器關(guān)閉")
            return
        }
        fmt.Println("讀到服務(wù)器回發(fā)的數(shù)據(jù):", string(sli[:n]))
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盗似,一起剝皮案震驚了整個(gè)濱河市哩陕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赫舒,老刑警劉巖悍及,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異接癌,居然都是意外死亡心赶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門扔涧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來园担,“玉大人,你說我怎么就攤上這事枯夜⊥涮” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵湖雹,是天一觀的道長咏闪。 經(jīng)常有香客問我,道長摔吏,這世上最難降的妖魔是什么鸽嫂? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮征讲,結(jié)果婚禮上据某,老公的妹妹穿的比我還像新娘。我一直安慰自己诗箍,他們只是感情好癣籽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滤祖,像睡著了一般筷狼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匠童,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天埂材,我揣著相機(jī)與錄音,去河邊找鬼汤求。 笑死俏险,一個(gè)胖子當(dāng)著我的面吹牛严拒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播竖独,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼糙俗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了预鬓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赊颠,失蹤者是張志新(化名)和其女友劉穎格二,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竣蹦,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顶猜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痘括。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片长窄。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖纲菌,靈堂內(nèi)的尸體忽然破棺而出挠日,到底是詐尸還是另有隱情,我是刑警寧澤翰舌,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布嚣潜,位于F島的核電站,受9級特大地震影響椅贱,放射性物質(zhì)發(fā)生泄漏懂算。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一庇麦、第九天 我趴在偏房一處隱蔽的房頂上張望计技。 院中可真熱鬧,春花似錦山橄、人聲如沸垮媒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涣澡。三九已至,卻和暖如春丧诺,著一層夾襖步出監(jiān)牢的瞬間入桂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工驳阎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抗愁,地道東北人馁蒂。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蜘腌,于是被迫代替她去往敵國和親沫屡。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理撮珠,服務(wù)發(fā)現(xiàn)沮脖,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評論 25 707
  • 物理學(xué)中有一個(gè)叫做觀察者效應(yīng)的概念芯急,他的意思是勺届,衡量一種現(xiàn)象的行為,有時(shí)候也會影響這種現(xiàn)象娶耍。類似的事情也會發(fā)生在交...
    李惻隱閱讀 275評論 0 3
  • 如果我們等到完完全全準(zhǔn)備好再結(jié)婚榕酒,那還有人會去結(jié)婚嗎胚膊?如果人們要等到百分百準(zhǔn)備好才要孩子,那世界人口不早就短缺了想鹰?...
    萬花谷閱讀 160評論 0 1
  • 請不要隨便給他(她)承諾…… 或許我們在許諾時(shí)太過隨意紊婉,才使得我們后悔了一輩子…… 當(dāng)下社會,談情說愛多容易杖挣,看對...
    葉落憂閱讀 204評論 0 2