go Socket編程

TCP

Socket客戶端

獲取連接

//1.
tcpAddr, err := net.ResolveTCPAddr("tcp4", ":8080")
checkError(err)
conn, err := net.DialTCP("tcp", nil, tcpAddr)
//2.
addr := "wwww.baidu.com:80" //定義主機(jī)名
conn,err := net.Dial("tcp",addr) //撥號(hào)操作,需要指定協(xié)議。

串行指定讀取客戶端返回內(nèi)容大小

package main
import (
    "io"
    "fmt"
    "log"
    "net"
    "reflect"
)
func main() {
    addr := "wwww.baidu.com:80" //定義主機(jī)名
    conn,err := net.Dial("tcp",addr) //撥號(hào)操作巧勤,需要指定協(xié)議沸伏。
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("訪問(wèn)公網(wǎng)IP地址是:",conn.RemoteAddr().String()) /*獲取“conn”中的公網(wǎng)地址享钞。注意:最好是加上后面的String方法船万,因?yàn)樗麄兊哪切┦遣灰粯拥膯选ぎ?dāng)然你打印的時(shí)候
        可以不加輸出結(jié)果是一樣的街立,但是你的內(nèi)心是不一樣的喲滨溉!*/
    fmt.Printf("客戶端鏈接的地址及端口是:%v\n",conn.LocalAddr()) //獲取到本地的訪問(wèn)地址和端口什湘。
    fmt.Println("“conn.LocalAddr()”所對(duì)應(yīng)的數(shù)據(jù)類型是:",reflect.TypeOf(conn.LocalAddr()))
    fmt.Println("“conn.RemoteAddr().String()”所對(duì)應(yīng)的數(shù)據(jù)類型是:",reflect.TypeOf(conn.RemoteAddr().String()))
    n,err := conn.Write([]byte("GET / HTTP/1.1\r\n\r\n")) //向服務(wù)端發(fā)送數(shù)據(jù)长赞。用n接受返回的數(shù)據(jù)大小,用err接受錯(cuò)誤信息闽撤。
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("向服務(wù)端發(fā)送的數(shù)據(jù)大小是:",n)

    buf := make([]byte,1024) //定義一個(gè)切片的長(zhǎng)度是1024得哆。

    n,err = conn.Read(buf) //接收到的內(nèi)容大小。

    if err != nil && err != io.EOF {  //io.EOF在網(wǎng)絡(luò)編程中表示對(duì)端把鏈接關(guān)閉了哟旗。
        log.Fatal(err)
    }
    fmt.Println(string(buf[:n])) //將接受的內(nèi)容都讀取出來(lái)贩据。
    conn.Close()  //斷開(kāi)TCP鏈接。
}

按照指定方式循環(huán)讀取

package main
import (
    "io"
    "fmt"
    "log"
    "net"
    "reflect"
)
func main() {
    addr := "wwww.baidu.com:80" //定義主機(jī)名
    conn,err := net.Dial("tcp",addr) //撥號(hào)操作闸餐,需要指定協(xié)議饱亮。
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(conn.RemoteAddr().String()) //最好是加上后面的String方法,因?yàn)樗麄兊哪切┦遣灰粯拥膯选ぎ?dāng)然你打印的時(shí)候可以不加舍沙。
    fmt.Println(conn.LocalAddr())
    fmt.Println(reflect.TypeOf(conn.LocalAddr()))
    fmt.Println(reflect.TypeOf(conn.RemoteAddr().String()))
    n,err := conn.Write([]byte("GET / HTTP/1.1\r\n\r\n")) //向服務(wù)端發(fā)送數(shù)據(jù)近上。用n接受返回的數(shù)據(jù)大小,用err接受錯(cuò)誤信息场勤。
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("寫(xiě)入的大小是:",n)

    buf := make([]byte,10) //定義一個(gè)切片的長(zhǎng)度是1024戈锻。

    for  {
        n,err = conn.Read(buf) //接收到的內(nèi)容大小。
        if err == io.EOF {
            conn.Close()
        }
        fmt.Print(string(buf[:n]))
    }
    fmt.Println(string(buf[:n])) //將接受的內(nèi)容都讀取出來(lái)和媳。
}

按行讀取

package main
import (
    "io"
    "fmt"
    "log"
    "net"
    "reflect"
    "bufio"
)
func main() {
    addr := "wwww.baidu.com:80" //定義主機(jī)名
    conn,err := net.Dial("tcp",addr) //撥號(hào)操作格遭,需要指定協(xié)議。
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(conn.RemoteAddr().String()) //最好是加上后面的String方法留瞳,因?yàn)樗麄兊哪切┦遣灰粯拥膯选ぎ?dāng)然你打印的時(shí)候可以不加拒迅。
    fmt.Println(conn.LocalAddr())
    fmt.Println(reflect.TypeOf(conn.LocalAddr()))
    fmt.Println(reflect.TypeOf(conn.RemoteAddr().String()))
    n,err := conn.Write([]byte("GET / HTTP/1.1\r\n\r\n")) //向服務(wù)端發(fā)送數(shù)據(jù)。用n接受返回的數(shù)據(jù)大小她倘,用err接受錯(cuò)誤信息璧微。
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("寫(xiě)入的大小是:",n)

    r := bufio.NewReader(conn) //將這個(gè)鏈接(connection)包裝以下。將conn的內(nèi)容都放入r中硬梁,但是沒(méi)有進(jìn)行讀取前硫,讓步我們一會(huì)對(duì)其進(jìn)行操作。
    for  {
        line,err := r.ReadString('\n') //將r的內(nèi)容也就是conn的數(shù)據(jù)按照換行符進(jìn)行讀取荧止。
        if err == io.EOF {
            conn.Close()
        }
        fmt.Print(line)
    }
}

io讀取

package main
import (
    "io"
    "fmt"
    "log"
    "net"
    "reflect"
    "os"
)
func main() {
    addr := "wwww.baidu.com:80" //定義主機(jī)名
    conn,err := net.Dial("tcp",addr) //撥號(hào)操作屹电,需要指定協(xié)議。
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("訪問(wèn)公網(wǎng)IP地址以及端口是:",conn.RemoteAddr().String()) /*獲取“conn”中的公網(wǎng)地址跃巡。注意:最好是加上后面的String方法危号,因?yàn)樗麄兊哪切┦遣灰粯拥膯选ぎ?dāng)然你打印的時(shí)候
        可以不加輸出結(jié)果是一樣的,但是你的內(nèi)心是不一樣的喲素邪!*/
    fmt.Printf("客戶端鏈接的地址及端口是:%v\n",conn.LocalAddr()) //獲取到本地的訪問(wèn)地址和端口外莲。
    fmt.Println("“conn.LocalAddr()”所對(duì)應(yīng)的數(shù)據(jù)類型是:",reflect.TypeOf(conn.LocalAddr()))
    fmt.Println("“conn.RemoteAddr().String()”所對(duì)應(yīng)的數(shù)據(jù)類型是:",reflect.TypeOf(conn.RemoteAddr().String()))
    n,err := conn.Write([]byte("GET / HTTP/1.1\r\n\r\n")) //向服務(wù)端發(fā)送數(shù)據(jù)。用n接受返回的數(shù)據(jù)大小兔朦,用err接受錯(cuò)誤信息偷线。
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("寫(xiě)入的大小是:",n)
    io.Copy(os.Stdout,conn)
    conn.Close()
}

Socket服務(wù)端

串行服務(wù)端

package main
import (
    "log"
    "net"
    "time"
)
func main() {
    addr := "0.0.0.0:8080" //表示監(jiān)聽(tīng)本地所有ip的8080端口磨确,也可以這樣寫(xiě):addr := ":8080"
    listener,err := net.Listen("tcp",addr) //使用協(xié)議是tcp,監(jiān)聽(tīng)的地址是addr
    if err != nil {
        log.Fatal(err)
    }
    defer listener.Close() //關(guān)閉監(jiān)聽(tīng)的端口
    for  {
        conn,err := listener.Accept() //用conn接收鏈接
        if err != nil {
            log.Fatal(err)
        }
        conn.Write([]byte("helloword\n"))  //通過(guò)conn的wirte方法將這些數(shù)據(jù)返回給客戶端淋昭。
        conn.Write([]byte("hello Golang\n"))
        conn.Close() //與客戶端斷開(kāi)連接俐填。
    }
}

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

package main

import (
    "net"
    "log"
    "time"
)

func Handle_conn(conn net.Conn) { //這個(gè)是在處理客戶端會(huì)阻塞的代碼。
    conn.Write([]byte(time.Now().Local().String()))//通過(guò)conn的wirte方法將這些數(shù)據(jù)返回給客戶端翔忽。
    conn.Close() //與客戶端斷開(kāi)連接英融。
}
func main() {
    addr := "0.0.0.0:8080" //表示監(jiān)聽(tīng)本地所有ip的8080端口,也可以這樣寫(xiě):addr := ":8080"
    listener,err := net.Listen("tcp",addr)
    if err != nil {
        log.Fatal(err)
    }
    defer listener.Close()

    for  {
        conn,err := listener.Accept() //用conn接收鏈接
        if err != nil {
            log.Fatal(err)
        }
        go Handle_conn(conn)  //開(kāi)啟多個(gè)協(xié)程歇式。
    }
}

web并發(fā)服務(wù)器驶悟;

package main

import (
    "net"
    "log"
)

var content = `HTTP/1.1 200 OK
        Date: Sat, 29 Jul 2017 06:18:23 GMT
        Content-Type: text/html
        Connection: Keep-Alive
        Server: BWS/1.1
        X-UA-Compatible: IE=Edge,chrome=1
        BDPAGETYPE: 3
        Set-Cookie: BDSVRTM=0; path=/

<!doctype html>
<html class="no-js">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>Amaze UI Admin 404 Examples</title>
  <meta name="description" content="這是一個(gè)404頁(yè)面">
  <meta name="keywords" content="404">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="renderer" content="webkit">
  <meta http-equiv="Cache-Control" content="no-siteapp" />
  <meta name="apple-mobile-web-app-title" content="Amaze UI" />
  <link rel="stylesheet" href="assets/css/amazeui.min.css"/>
  <link rel="stylesheet" href="assets/css/admin.css">
</head>
<body>
<!--[if lte IE 9]>
<p class="browsehappy">你正在使用<strong>過(guò)時(shí)</strong>的瀏覽器,Amaze UI 暫不支持材失。 請(qǐng) <a  target="_blank">升級(jí)瀏覽器</a>
  以獲得更好的體驗(yàn)痕鳍!</p>
<![endif]-->
<div >
  <!-- sidebar start -->
  <!-- sidebar end -->

  <!-- content start -->
  <div >
    <div class="admin-content-body">
      <hr>

      <div class="am-g">
        <div class="am-u-sm-12">
          <h2 class="am-text-center am-text-xxxl am-margin-top-lg">404. Not Found</h2>
          <p class="am-text-center">沒(méi)有找到你要的頁(yè)面</p>
</div>
</div>
</div>
<!-- content end -->

</div>
<!--[if lt IE 9]>
<script src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script>
<script src="http://cdn.staticfile.org/modernizr/2.8.3/modernizr.js"></script>
<script src="assets/js/amazeui.ie8polyfill.min.js"></script>
<![endif]-->

<!--[if (gte IE 9)|!(IE)]><!-->

</body>
</html>`

func Handle_conn(conn net.Conn) { //這個(gè)是在處理客戶端會(huì)阻塞。
    conn.Write([]byte(content)) //將html的代碼返回給客戶端龙巨,這樣客戶端在web上訪問(wèn)就可以拿到指定字符笼呆。
    conn.Close()
}


func main() {
    addr := "0.0.0.0:8080" //表示監(jiān)聽(tīng)本地所有ip的8080端口,也可以這樣寫(xiě):addr := ":8080"
    listener,err := net.Listen("tcp",addr)
    if err != nil {
        log.Fatal(err)
    }
    defer listener.Close()

    for  {
        conn,err := listener.Accept() //用conn接收鏈接
        if err != nil {
            log.Fatal(err)
        }
        go Handle_conn(conn) //將接受來(lái)的鏈接交給該函數(shù)去處理旨别。
    }
}

UDP

客戶端

package main

import (
    "fmt"
    "net"
    "os"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0])
        os.Exit(1)
    }
    service := os.Args[1]
    udpAddr, err := net.ResolveUDPAddr("udp4", service)
    checkError(err)
    conn, err := net.DialUDP("udp", nil, udpAddr)
    checkError(err)
    _, err = conn.Write([]byte("anything"))
    checkError(err)
    var buf [512]byte
    n, err := conn.Read(buf[0:])
    checkError(err)
    fmt.Println(string(buf[0:n]))
    os.Exit(0)
}
func checkError(err os.Error) {
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error ", err.String())
        os.Exit(1)
    }
}

服務(wù)器

package main

import (
    "fmt"
    "net"
    "os"
    "time"
)

func main() {
    service := ":1200"
    udpAddr, err := net.ResolveUDPAddr("udp4", service)
    checkError(err)
    conn, err := net.ListenUDP("udp", udpAddr)
    checkError(err)
    for {
        handleClient(conn)
    }
}
func handleClient(conn *net.UDPConn) {
    var buf [512]byte
    _, addr, err := conn.ReadFromUDP(buf[0:])
    if err != nil {
        return
    }
    daytime := time.LocalTime().String()
    conn.WriteToUDP([]byte(daytime), addr)
}
func checkError(err os.Error) {
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error ", err.String())
        os.Exit(1)
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诗赌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秸弛,更是在濱河造成了極大的恐慌铭若,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件递览,死亡現(xiàn)場(chǎng)離奇詭異叼屠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绞铃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門镜雨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人儿捧,你說(shuō)我怎么就攤上這事冷离。” “怎么了纯命?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)痹栖。 經(jīng)常有香客問(wèn)我亿汞,道長(zhǎng),這世上最難降的妖魔是什么揪阿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任疗我,我火速辦了婚禮咆畏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吴裤。我一直安慰自己旧找,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布麦牺。 她就那樣靜靜地躺著钮蛛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剖膳。 梳的紋絲不亂的頭發(fā)上魏颓,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音吱晒,去河邊找鬼甸饱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仑濒,可吹牛的內(nèi)容都是我干的叹话。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼墩瞳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驼壶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起矗烛,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辅柴,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瞭吃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碌嘀,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年歪架,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了股冗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡和蚪,死狀恐怖止状,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攒霹,我是刑警寧澤怯疤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站催束,受9級(jí)特大地震影響集峦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一塔淤、第九天 我趴在偏房一處隱蔽的房頂上張望摘昌。 院中可真熱鬧,春花似錦高蜂、人聲如沸聪黎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)稿饰。三九已至,卻和暖如春烘跺,著一層夾襖步出監(jiān)牢的瞬間湘纵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工滤淳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梧喷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓脖咐,卻偏偏與公主長(zhǎng)得像铺敌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屁擅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 本文通過(guò)回顧 teleport (https://github.com/henrylee2cn/teleport)...
    Andeya閱讀 8,569評(píng)論 4 14
  • 從三月份找實(shí)習(xí)到現(xiàn)在偿凭,面了一些公司,掛了不少派歌,但最終還是拿到小米弯囊、百度、阿里胶果、京東匾嘱、新浪、CVTE早抠、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,192評(píng)論 11 349
  • 原文地址:http://www.cnblogs.com/skynet/archive/2010/12/12/190...
    archyly閱讀 1,057評(píng)論 0 8
  • 寫(xiě)著玩…… 自起名墨霎烙,一撮黑土,不是黃土蕊连、白沙悬垃,更不是巖石,來(lái)于自然甘苍,生命盡頭歸于自然尝蠕,希望有點(diǎn)營(yíng)養(yǎng)、有點(diǎn)文化载庭、有...
    小墨022T閱讀 181評(píng)論 0 0
  • 醒來(lái)甚覺(jué)愛(ài)你看彼。 想了一夜的你扇谣, 枕邊無(wú)你。 夢(mèng)了一下午的你闲昭, 醒后無(wú)你。 是清晨的空虛 是傍晚的茫然 原諒我早晨的...
    一只夏妖閱讀 147評(píng)論 0 0