您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 0浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Go语言简单的TCP编程

phymat.nico 发布时间:2017-12-25 23:37:57 ,浏览量:0

前期准备
  • 需要import "net"
  • IP类型,其中一个重要的方法是IP.ParseIP(ipaddr string)来判断是否是合法的IP地址
TCP Client
  • 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或者tcp6laddr表示本机地址,一般为nilraddr表示远程地址,这里的laddrraddr都是TCPAddr类型的,一般是上一个函数的返回值。
  • 作为一个TCP的客户端,基本的操作流程如下:

      service="www.google.com:80"
      tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
      conn, err := net.DialTCP("tcp", nil, tcpAddr)
      _, err = conn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n"))
      _, err = conn.Read(b) / result, err := ioutil.ReadAll(conn)
    
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
  1. package main  
  2.   
  3. import(  
  4.     "fmt"  
  5.     "os"  
  6.     "net"  
  7. )  
  8.   
  9.   
  10. //  
  11. //错误检查  
  12. //  
  13.   
  14. func checkError(err error,info string) (res bool) {  
  15.       
  16.     if(err != nil){  
  17.         fmt.Println(info+"  " + err.Error())  
  18.         return false  
  19.     }  
  20.     return true  
  21. }  
  22.   
  23.   
  24. //  
  25. //服务器端接收数据线程  
  26. //参数:  
  27. //      数据连接 conn  
  28. //      通讯通道 messages  
  29. //  
  30.   
  31. func Handler(conn net.Conn,messages chan string){  
  32.       
  33.     fmt.Println("connection is connected from ...",conn.RemoteAddr().String())  
  34.       
  35.     buf := make([]byte,1024)  
  36.     for{  
  37.         lenght, err := conn.Read(buf)  
  38.         if(checkError(err,"Connection")==false){  
  39.             conn.Close()  
  40.             break  
  41.         }  
  42.         if lenght > 0{  
  43.             buf[lenght]=0  
  44.         }  
  45.         //fmt.Println("Rec[",conn.RemoteAddr().String(),"] Say :" ,string(buf[0:lenght]))  
  46.         reciveStr :=string(buf[0:lenght])  
  47.         messages 
关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.1011s