生活随笔
收集整理的這篇文章主要介紹了
Go语言简单的TCP编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前期準備
- 需要import "net"包
- IP類型,其中一個重要的方法是IP.ParseIP(ipaddr string)來判斷是否是合法的IP地址
TCP Client
TCP Server
- func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err os.Error)用來監聽端口,net表示協議類型,laddr表示本機地址,是TCPAddr類型,注意,此處的laddr包括端口,返回一個*TCPListener類型或者錯誤
- func (l *TCPListener) Accept() (c Conn, err os.Error)用來返回一個新的連接,進行后續操作,這是TCPListener的方法,一般TCPListener從上一個函數返回得來。
-
服務器的基本操作流程為:
service:=":9090"tcpAddr, err := net.ResolveTCPAddr("tcp4", service)l,err := net.ListenTCP("tcp",tcpAddr)conn,err := l.Accept()go Handler(conn) //此處使用go關鍵字新建線程處理連接,實現并發
一個例子
需求
實現一個公共聊天服務器。
- 服務器接收客戶端的信息
- 接收完以后將客戶端的信息發送到所有的客戶端上
- 客戶端使用/quit退出聊天
- 只使用一套代碼,通過命令行參數啟動服務器還是客戶端
實現:
[cpp] view plain
copy package?main????import(??????"fmt"??????"os"??????"net"??)??????????????func?checkError(err?error,info?string)?(res?bool)?{????????????if(err?!=?nil){??????????fmt.Println(info+"??"?+?err.Error())??????????return?false??????}??????return?true??}????????????????????func?Handler(conn?net.Conn,messages?chan?string){????????????fmt.Println("connection?is?connected?from?...",conn.RemoteAddr().String())????????????buf?:=?make([]byte,1024)??????for{??????????lenght,?err?:=?conn.Read(buf)??????????if(checkError(err,"Connection")==false){??????????????conn.Close()??????????????break??????????}??????????if?lenght?>?0{??????????????buf[lenght]=0??????????}????????????????????reciveStr?:=string(buf[0:lenght])??????????messages?<-?reciveStr????????????????????}????????????}??????????????????????func?echoHandler(conns?*map[string]net.Conn,messages?chan?string){??????????????????for{??????????msg:=?<-?messages??????????fmt.Println(msg)????????????????????for?key,value?:=?range?*conns?{????????????????????????????fmt.Println("connection?is?connected?from?...",key)??????????????_,err?:=value.Write([]byte(msg))??????????????if(err?!=?nil){??????????????????fmt.Println(err.Error())??????????????????delete(*conns,key)??????????????}????????????????????????}??????}????????}????????????????????func?StartServer(port?string){??????????service:=":"+port???????????tcpAddr,?err?:=?net.ResolveTCPAddr("tcp4",?service)??????????checkError(err,"ResolveTCPAddr")??????????l,err?:=?net.ListenTCP("tcp",tcpAddr)??????????checkError(err,"ListenTCP")??????????conns:=make(map[string]net.Conn)??????????messages?:=?make(chan?string,10)????????????????????go?echoHandler(&conns,messages)????????????????????for??{??????????????fmt.Println("Listening?...")??????????????conn,err?:=?l.Accept()??????????????checkError(err,"Accept")??????????????fmt.Println("Accepting?...")??????????????conns[conn.RemoteAddr().String()]=conn????????????????????????????go?Handler(conn,messages)?????????????????????????}????????????}????????????????????func?chatSend(conn?net.Conn){????????????var?input?string??????username?:=?conn.LocalAddr().String()??????for?{????????????????????fmt.Scanln(&input)??????????if?input?==?"/quit"{??????????????fmt.Println("ByeBye..")??????????????conn.Close()??????????????os.Exit(0);??????????}??????????????????????????????lens,err?:=conn.Write([]byte(username?+?"?Say?:::"?+?input))??????????fmt.Println(lens)??????????if(err?!=?nil){??????????????fmt.Println(err.Error())??????????????conn.Close()??????????????break??????????}????????????????}????????}??????????????????func?StartClient(tcpaddr?string){????????????tcpAddr,?err?:=?net.ResolveTCPAddr("tcp4",?tcpaddr)??????checkError(err,"ResolveTCPAddr")??????conn,?err?:=?net.DialTCP("tcp",?nil,?tcpAddr)??????checkError(err,"DialTCP")????????????go?chatSend(conn)?????????????????????buf?:=?make([]byte,1024)??????for{????????????????????lenght,?err?:=?conn.Read(buf)??????????if(checkError(err,"Connection")==false){??????????????conn.Close()??????????????fmt.Println("Server?is?dead?...ByeBye")??????????????os.Exit(0)??????????}??????????fmt.Println(string(buf[0:lenght]))????????????????}??}????????????????????????func?main(){??????????????????if?len(os.Args)!=3??{?????????????fmt.Println("Wrong?pare")??????????os.Exit(0)??????}????????????if?os.Args[1]=="server"?&&?len(os.Args)==3?{????????????????????StartServer(os.Args[2])??????}??????????????????if?os.Args[1]=="client"?&&?len(os.Args)==3?{????????????????????StartClient(os.Args[2])??????}??????????????}??
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的Go语言简单的TCP编程的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。