一.go语言中http.handle和http.HandleFunc
二.go语言中的网络编程主要通过net包实现,net包提供了网络I/O接口,包括HTTP、TCP/IP、UDP、域名解析和Unix域socket等。和大多数语言一样go可以使用几行代码便可以启动一个服务器,但是得益于goroutine的配合go实现的服务器拥有强大并发处理能力。
socket编程:Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电话到总机,然后再转分机 。
go中socket编程实现起来非常方便,下面是处理流程:
服务器端:
- 监听端口
- 接受客户端连接
- 创建goroutine处理连接
客户端:
- 建立连接
- 收发数据
- 关闭连接
服务端示例:
package main
import (
"fmt"
"net"
)
func handle(conn net.Conn) { //处理连接方法
defer conn.Close() //关闭连接
for{
buf := make([]byte,100)
n,err := conn.Read(buf) //读取客户端数据
if err!=nil {
fmt.Println(err)
return
}
fmt.Printf("read data size %d msg:%s", n, string(buf[0:n]))
msg := []byte("hello,world\n")
conn.Write(msg) //发送数据
}
}
func main() {
fmt.Println("start server....")
listen,err := net.Listen("tcp","0.0.0.0:3000") //创建监听
if err != nil{
fmt.Println("listen failed! msg :" ,err)
return
}
for{
conn,errs := listen.Accept() //接受客户端连接
if errs != nil{
fmt.Println("accept failed")
continue
}
go handle(conn) //处理连接
}
}
客户端示例:
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:3000")
if err != nil {
fmt.Println("err dialing:", err.Error())
return
}
defer conn.Close()
inputReader := bufio.NewReader(os.Stdin)
for {
str, _ := inputReader.ReadString('\n')
data := strings.Trim(str, "\n")
if data == "quit" { //输入quit退出
return
}
_, err := conn.Write([]byte(data)) //发送数据
if err != nil {
fmt.Println("send data error:", err)
return
}
buf := make([]byte,512)
n,err := conn.Read(buf) //读取服务端端数据
fmt.Println("from server:", string(buf[:n]) }
}
conn还提供了其它方法:
type Conn interface {
// Read reads data from the connection.
// Read can be made to time out and return an Error with Timeout() == true
// after a fixed time limit; see SetDeadline and SetReadDeadline.
Read(b []byte) (n int, err error) //读取连接中数据
// Write writes data to the connection.
// Write can be made to time out and return an Error with Timeout() == true
// after a fixed time limit; see SetDeadline and SetWriteDeadline.
Write(b []byte) (n int, err error) //发送数据
// Close closes the connection.
// Any blocked Read or Write operations will be unblocked and return errors.
Close() error //关闭链接
// LocalAddr returns the local network address.
LocalAddr() Addr //返回本地连接地址
// RemoteAddr returns the remote network address.
RemoteAddr() Addr //返回远程连接的地址
// SetDeadline sets the read and write deadlines associated
// with the connection. It is equivalent to calling both
// SetReadDeadline and SetWriteDeadline.
//
// A deadline is an absolute time after which I/O operations
// fail with a timeout (see type Error) instead of
// blocking. The deadline applies to all future and pending
// I/O, not just the immediately following call to Read or
// Write. After a deadline has been exceeded, the connection
// can be refreshed by setting a deadline in the future.
//
// An idle timeout can be implemented by repeatedly extending
// the deadline after successful Read or Write calls.
//
// A zero value for t means I/O operations will not time out.
SetDeadline(t time.Time) error //设置链接读取或者写超时时间
// SetReadDeadline sets the deadline for future Read calls
// and any currently-blocked Read call.
// A zero value for t means Read will not time out.
SetReadDeadline(t time.Time) error //单独设置读取超时时间
// SetWriteDeadline sets the deadline for future Write calls
// and any currently-blocked Write call.
// Even if write times out, it may return n > 0, indicating that
// some of the data was successfully written.
// A zero value for t means Write will not time out.
SetWriteDeadline(t time.Time) error//单独设置写超时时间
}
http具体处理流程(转载)