1、TCP
服务端
- 监听端口
- 接收客户端请求建立链接
- 创建goroutine处理链接。
func main(){
listener,_:= net.Listen("tcp","127.0.0.1:9000") //监听端口
defer listener.Close()
for {
conn,_ := listener.Accept() //获取连接
go Something(conn)
}
}
func Something(conn net.Conn){
buf := make([]byte,256) //开辟缓冲区
defer conn.Close()
reader := bufio.NewReader(os.Stdin) //获取命令窗口标准输入
for {
n,_ := conn.Read(buf) //将客户端数据存入缓冲区
if n != 0{
fmt.Println("收到客户端消息",string(buf[:n])) //string(buf[:n])将字节数组强转为字符串
}
line,_,_ := reader.ReadLine() //获取一行输入
conn.Write(line) //将命令行数据传回客户端
}
}
}
客户端
- 建立与服务端的链接
- 进行数据收发
- 关闭链接
func main(){
conn,_ := net.Dial("tcp","127.0.0.1:9000") //建立连接
defer conn.Close()
reader := bufio.NewReader(os.Stdin) //获取命令行标准输入
buffer := make([]byte,1024) //新建缓冲区
for {
line,_,_ := reader.ReadLine() //获取一行输入
conn.Write(line) //将命令行数据写入
n,_ := conn.Read(buffer) //将服务端返回的数据写入缓冲区
fmt.Println(string(buffer[:n])) //将缓冲区内容读出
}
}
}
2、UDP
服务端
注意使用方法名的变化
- 监听端口
- 接收客户端数据
func main(){
listener,_ := net.ListenUDP("udp",&net.UDPAddr{IP:net.IPv4(0,0,0,0),Port:9001,})
defer listener.Close()
for {
var data [1024]byte
n,addr,_ := listener.ReadFromUDP(data[:])
fmt.Printf("data:%v addr:%v count:%v\n",string(data[:n]),addr,n)
}
}
客户端
- 建立与服务端的链接
- 发送数据
- 关闭链接
func main(){
socket,_ := net.DialUDP("udp",nil,&net.UDPAddr{IP:net.IPv4(0,0,0,0),Port:9001,})
defer socket.Close()
reader := bufio.NewReader(os.Stdin)
line,_,_ := reader.ReadLine()
socket.Write(line)
}
3、HTTP
服务端
func main(){
http.HandleFunc("/",HandleIndex) //第一个参数是路由匹配的字符串,第二个是Handler类型的值
http.ListenAndServe(":9002",nil)
}
func HandleIndex(w http.ResponseWriter,r *http.Request){
r.ParseForm()
fmt.Println(r.Header)
fmt.Println(r.URL)
}
客户端
func main(){
resp,_ := http.Get("127.0.0.1:9002")
defer resp.Body.Close()
body,_ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
附:Handler和HandlerFunc的区别
func Handle(pattern string, handler Handler) {
DefaultServeMux.Handle(pattern, handler)
}
第一个参数是路由匹配的字符串,第二个是Handler类型的值,即一个接口,包含了ServerHttp()方法,当接收到匹配路由的请求时,会调用这个方法
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
Handler和HandlerFunc
func Handle(pattern string, handler Handler) {
DefaultServeMux.Handle(pattern, handler)
}
第一个参数是路由匹配的字符串,第二个是Handler类型的值,即一个接口,包含了ServerHttp()方法,当接收到匹配路由的请求时,会调用这个方法
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
Handler和HandlerFunc
func Handle(pattern string, handler Handler) {
DefaultServeMux.Handle(pattern, handler)
}
第一个参数是路由匹配的字符串,第二个是Handler类型的值,即一个接口,包含了ServerHttp()方法,当接收到匹配路由的请求时,会调用这个方法
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
第一个参数是路由匹配的字符串,第二个是 func(ResponseWriter, *Request)
类型的函数,HandlerFunc类型实现了 ServeHTTP
接口,所以其也可以转换成 Handler
类型
type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
第一个参数是路由匹配的字符串,第二个是 func(ResponseWriter, *Request)
类型的函数,HandlerFunc类型实现了 ServeHTTP
接口,所以其也可以转换成 Handler
类型
type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
第一个参数是路由匹配的字符串,第二个是 func(ResponseWriter, *Request)
类型的函数,HandlerFunc类型实现了 ServeHTTP
接口,所以其也可以转换成 Handler
类型
type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}