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}