golang中的socket
生活随笔
收集整理的這篇文章主要介紹了
golang中的socket
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡介
網絡的socket數據傳輸是一種特殊的I/O,socket也是一種文件描述符.socket也具有一個類似打開文件的函數調用:socket(),該函數返回有一個整形的socket描述符,隨后的連接建立,數據傳輸等操作都是通過它實現的
常用的socket類型有兩種:流式socket(SOCK_STREAM)和數據報式socket(SOCK_DGRAM)
- 流式是一種面向連接的socket,針對面向連接的tcp服務應用
- 數據報式socket是一種無連接的socket,對應于無連接的udp服務應用
listen創建的socket不用于通信,用于監聽地址的,accept的socket是用來通信的
read讀服務/客戶,有返回0,對端關閉和你連接了
函數
server端
Listen函數
network:tcp或者udp
address:ip端口號比如127.0.0.1:9194或者:8005
Listener接口
type Listener interface {Accept() (Conn, error)Close() errorAddr() Addr }Conn接口
type Conn interface {Read(b []byte) (n int, err error)Write(b []byte) (n int, err error)Close() errorLocalAddr() AddrRemoteAddr() AddrSetDeadline(t time.Time) errorSetReadDeadline(t time.Time) errorSetWriteDeadline(t time.Time) error }tcp服務代碼
func main() {listener, err := net.Listen("tcp", "0.0.0.0:8183")if err != nil {fmt.Println("err = ", err)return}//退出前把監聽關閉defer listener.Close()//阻塞等待用戶鏈接for {conn, err := listener.Accept()if err != nil {fmt.Println("err = ", err)continue}//接收用戶的請求//1024緩沖區buf := make([]byte, 1024)n, err1 := conn.Read(buf)if err1 != nil {fmt.Println("err1 = ", err1)continue}fmt.Println("buf = ", string(buf[:n]))//關閉當前用戶的連接defer conn.Close()} }tcp客戶端
func main() {conn, err := net.Dial("tcp", "127.0.0.1:8183")if err != nil {fmt.Println("err = ", err)return}defer conn.Close()//發送數據conn.Write([]byte("are u ok?")) }服務端多人
用nc做客戶端,telnet做客戶端好像會多傳東西
func HandleConn(conn net.Conn) {//獲取客戶端的網絡地址信息addr := conn.RemoteAddr().String()fmt.Println("連接成功: ", addr)//關閉連接defer conn.Close()buf := make([]byte, 2048)for {//讀取用戶數據,如果客戶端關閉了,好像是能發現這邊的n是等于0的n, err := conn.Read(buf)if err != nil {//客戶端意外關閉,也能發現fmt.Println("err = ", err)return}//打印數據fmt.Println("數據是: ", string(buf[:n]))//看里面多了哪些東西fmt.Println("長度是: ", len(string(buf[:n])))//因為客戶端傳遞來的有\nif "exit" == string(buf[:n-1]) {fmt.Println(addr, " exit")return}//把數據轉化為大寫再發送conn.Write([]byte(strings.ToUpper(string(buf[:n]))))} }func main() {listener, err := net.Listen("tcp", "0.0.0.0:8183")if err != nil {fmt.Println("err = ", err)return}//退出前把監聽關閉defer listener.Close()//阻塞等待用戶鏈接for {conn, err := listener.Accept()if err != nil {fmt.Println("err = ", err)return}//處理用戶請求go HandleConn(conn)} }可輸入回復客戶端
func main() {conn, err := net.Dial("tcp", "127.0.0.1:8183")if err != nil {fmt.Println("net.Dial err = ", err)return}//main調用完畢,關閉連接defer conn.Close()//接收服務器回復的數據go func() {//從鍵盤輸入內容,給服務器發送內容str := make([]byte, 1024)for {n, err := os.Stdin.Read(str)if err != nil {fmt.Println("錯誤信息是: ", err)return}//把輸入的內容發給服務器conn.Write(str[:n])}}()//切片緩沖buf := make([]byte, 1024)for {//如果服務端關閉和你連接,這邊的n是能讀取到0的n, err := conn.Read(buf)if err != nil {fmt.Println("錯誤信息是: ", err)return}fmt.Println(string(buf[:n]))} }總結
以上是生活随笔為你收集整理的golang中的socket的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang中的sync.once
- 下一篇: golang中的并发服务器