tcp编程(需要建立连接,三次握手,四次挥手,然后发送信息流,数据包是有序的)
udp编程(知道IP、端口直接发送数据,数据包可能是无序的)
1、客户端和服务器客
socket编程
1.服务端的处理流程
a.监听端口
b.接收客户端的链接
c.创建goroutine,处理该链接
2.客户端的处理流程
a.建立与服务端的链接
b.进行数据收发
c.关闭链接
3.服务端代码
package main import ( "fmt" "net"//导入socket的包 ) func main() { fmt.Println("start server...") listen, err := net.Listen("tcp", "0.0.0.0:50000")//监听50000端口 if err != nil { fmt.Println("listen failed, err:", err) return } for { conn, err := listen.Accept()//等待客户端连接 if err != nil { fmt.Println("accept failed, err:", err) continue } go process(conn) } } func process(conn net.Conn) { defer conn.Close() for { buf := make([]byte, 512) _, err := conn.Read(buf)//读取客户端传输过来的数据 if err != nil { fmt.Println("read err:", err) return } fmt.Println("read: ", string(buf)) } }
4.客户端代码
package main import ( "bufio" "fmt" "net" "os" "strings" ) func main() { conn, err := net.Dial("tcp", "localhost:50000") //建立链接 if err != nil { fmt.Println("Error dialing", err.Error()) return } defer conn.Close() inputReader := bufio.NewReader(os.Stdin) //从终端读取数据 for { input, _ := inputReader.ReadString(‘\n‘) //从终端读取一行数据 trimmedInput := strings.Trim(input, "\r\n")//去掉字符串\r\n if trimmedInput == "Q" { return } _, err = conn.Write([]byte(trimmedInput))//将信息发给服务端 if err != nil { return } } }