博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Google Go TCP 开发
阅读量:6953 次
发布时间:2019-06-27

本文共 2878 字,大约阅读时间需要 9 分钟。

  hot3.png

GO 的TCP开发

  • 需要import "net"包
  • IP类型,其中一个重要的方法是IP.ParseIP(ipaddr string)来判断是否是合法的IP地址

与TCP相关的函数

  • func (c *TCPConn) Write(b []byte) (n int, err os.Error)用于发送数据,返回发送的数据长度或者返回错误,是TCPConn的方法
  • func (c *TCPConn) Read(b []byte) (n int, err os.Error)用于接收数据,返回接收的长度或者返回错误,是TCPConn的方法 TCPAddr类型,保存TCP的地址信息,包括地址和端口 type TCPAddr struct { IP IP Port int }
  • func ResolveTCPAddr(net, addr string) (*TCPAddr, os.Error)获取一个TCPAddr,参数都是string类型,net是个const string,包括tcp4,tcp6,tcp一般使用tcp,兼容v4和v6,addr表示ip地址,包括端口号,如www.google.com:80之类的
  • func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error)用来连接(connect)到远程服务器上,net表示协议方式,tcp,tcp4或者tcp6,laddr表示本机地址,一般为nil,raddr表示远程地址,这里的laddr和raddr都是TCPAddr类型的,一般是上一个函数的返回值。
  • 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从上一个函数返回得来。

运行 以后可以使用 telnet 来测试。

package mainimport ( "fmt" "os" "net")func main() { if len(os.Args) != 2{ fmt.Println("Wrong pare") os.Exit(0) } StartServer( os.Args[1])}func StartServer(port string){ server := "127.0.0.1:" + port tcpAddress, err := net.ResolveTCPAddr("tcp4", server) CheckError(err, "ResolveTCPAddr") l, err := net.ListenTCP("tcp", tcpAddress) CheckError(err, "ListenTCP") connects := make(map[string] net.Conn) message := make(chan string, 10) /** 启动服务端广播线程 */ go EchoHandler(&connects, message) for { fmt.Println("Listening ...") conn, err := l.Accept() CheckError(err, "Accept") fmt.Println("Accepting ...") connects[conn.RemoteAddr().String()] = conn /** 启动一个新的协程 */ go Handler(conn, message) }}func EchoHandler(connects *map[string] net.Conn, message chan string) { for { msg := <- message fmt.Println(msg) for key, value := range *connects { fmt.Println("Connection is connected from ...", key) _, err := value.Write([]byte(msg)) if err != nil { fmt.Println(err.Error()) delete (*connects, key) } } }}func Handler(connect net.Conn, message chan string) { buf := make([]byte, 1024) for { length, err := connect.Read(buf) if CheckError(err, "Connection") == false { connect.Close() break } if length > 0 { buf[length] = 0 } fmt.Println("Rec[", connect.RemoteAddr().String(), "] Say : ", string(buf[:length])) reciveStr := string(buf[:length]) message <- reciveStr }}func CheckError(err error, info string) (res bool) { if err != nil { fmt.Println(info + " " + err.Error()); return false } return true}

转载于:https://my.oschina.net/jackin/blog/285084

你可能感兴趣的文章
python while循环和双层循环
查看>>
ubuntu增加swap空间
查看>>
命令 cd
查看>>
数据结构C语言之多项式
查看>>
iOS 友盟统计
查看>>
libshmcache:速度比远程接口如redis快100倍以上
查看>>
无法载入虚拟机系统
查看>>
高性能WEB开发之如何减少请求数
查看>>
python3-字典的循环
查看>>
我的友情链接
查看>>
系统监控工具汇总
查看>>
win7 系统保留分区 BCDedit
查看>>
rsync 实时同步
查看>>
集群简单概述
查看>>
Windows 2012初探之一:分区管理
查看>>
python之文件的基本操作
查看>>
【2013-6-28】零售快消行业最佳实践交流会
查看>>
Nfs 网络文件系统
查看>>
debian或ubuntu修改时区
查看>>
mysql升级:rpm包安装升级
查看>>