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)
}
}