您好,登錄后才能下訂單哦!
// code_050_socket_knowledge project main.go
package main
import (
"fmt"
)
//TCP的C/S架構
//TCP客戶端:net.Dial() Write() Read() Close()
//TCP服務器:net.Listen() Accept() Read() Write() Close()
/*
Unix基本哲學之一就是“一切皆文件”,
都可以用“打開open –> 讀寫write/read –> 關閉close”模式來操作。
Socket就是該模式的一個實現,網絡的Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。
Socket也具有一個類似于打開文件的函數調用:Socket(),該函數返回一個整型的Socket描述符,
隨后的連接建立、數據傳輸等操作都是通過該Socket實現的
*/
//常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。
func main() {
fmt.Println("Hello World!")
}
// code_051_tcp_service project main.go
package main
import (
"fmt"
"log"
"net"
"strings"
)
func dealConn(conn net.Conn) {
defer conn.Close()
ipAddr := conn.RemoteAddr().String()
fmt.Println(ipAddr, "連接成功")
buf := make([]byte, 1024)
for {
//阻塞等待用戶發送的數據
n, err := conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
//切片截取,只截取有效數據
result := buf[:n]
fmt.Printf("接收到數據來自[%s]==>[%d]:%s\n", ipAddr, n, string(result))
if "exit" == string(result) {
fmt.Println(ipAddr, "退出連接")
return
}
conn.Write([]byte(strings.ToUpper(string(result))))
}
}
func main() {
listenner, err := net.Listen("tcp", "127.0.0.1:8001")
//go中的接口被占用報錯:An attempt was made to access a socket in a way forbidden by its access permissions.
if err != nil {
log.Fatal(err) //log.Fatal()會產生panic
}
for {
conn, err := listenner.Accept()
if err != nil {
log.Println(err)
continue
}
go dealConn(conn)
}
}
// code_052_tcp_client project main.go
package main
import (
"fmt"
"log"
"net"
)
func main() {
//客戶端主動連接服務器
conn, err := net.Dial("tcp", "127.0.0.1:8001")
if err != nil {
log.Fatal(err) //log.Fatal()會產生panic
return
}
defer conn.Close() //關閉
buf := make([]byte, 1024) //緩沖區
for {
fmt.Printf("請輸入發送的內容:")
fmt.Scan(&buf) //相當于Python中的input-->>buf = input("請輸入發送的內容")
fmt.Printf("發送的內容:%s\n", string(buf))
conn.Write(buf)
n, err := conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
result := buf[:n]
fmt.Printf("接收到數據[%d]:%s\n", n, string(result))
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。