安全传输协议(Transport Layer Security)简称TLS协议,其是SSL协议的升级版,用于实现两个程序之间的加密通信:
Golang的net/http包golang的net/http包提供了网络访问相关的api,可实现tcp、udp以及http的访问:
listen, err := net.Listen("tcp", "127.0.0.1:16666")
conn, err := net.Dial("tcp", "127.0.0.1:16666")
// 单独写回调函数
http.HandleFunc("/go", myHandler)
//http.HandleFunc("/ungo",myHandler2 )
// addr:监听的地址
// handler:回调函数
http.ListenAndServe("127.0.0.1:8000", nil)
使用net/http实现基本的https 服务端/客户端
申请tls证书
我们实现一个接收[]string的数组,然后判断是否已经接收过,最后返回[]bool,下面直接上代码:
服务端
func RunServer() {
fmt.Println("Run server...")
listen()
}
func listen() {
http.HandleFunc("/hello",handler)
err:=http.ListenAndServeTLS(":16666","ssl.crt","ssl.key", nil)
if err!=nil{
fmt.Println("ListenAndServe:",err)
}
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Println("Server starting handle...")
buf := make([]byte, 1024)
var recvStr string
for{
n,err:=r.Body.Read(buf)
if err != nil && err != io.EOF {
fmt.Println(err)
return
} else {
recvStr += string(buf[:n])
break
}
}
var result []bool
if len(recvStr)>0{
datas:=strings.Split(recvStr,"\n")
result=make([]bool,len(datas))
lock.Lock()
for i,v:=range datas{
if _,ok:=ReceivedDatas[v];ok{
result[i]=true
}else {
result[i]=false
ReceivedDatas[v]=true
}
}
lock.Unlock()
}else {
result=make([]bool,0)
}
w.Header().Set("Content-Type","text/plain")
resultJson, err :=json.Marshal(result)
if err!=nil{
w.Write([]byte("500"))
}
w.Write(resultJson)
}
客户端
func Client(input []string) ([]bool,error) {
//设置tls配置信息
tr := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
}
transData:=strings.Join(input,"\n")
client := &http.Client{Transport: tr}
res,err:=client.Post("https://127.0.0.1:16666/hello","text/plain",strings.NewReader(transData))
if err!=nil{
return nil,err
}
defer res.Body.Close()
if res.StatusCode!=200{
return nil,errors.New("500")
}
body,err:=ioutil.ReadAll(res.Body)
if err!=nil{
return nil,err
}
if string(body)=="500"{
return nil,errors.New("500")
}
var result []bool
err=json.Unmarshal(body,&result)
if err!=nil{
return nil,err
}
return result,err
}
全局变量:
var ReceivedDatas map[string]bool
var lock sync.Mutex
func init() {
ReceivedDatas=make(map[string]bool,0)
}
最后我们来测试一下:
新建一个测试文件,代码如下:
func TestClient(t *testing.T) {
go RunServer()
inputs:=[]string{"hi","hello"}
result,err:=Client(inputs)
if err!=nil{
t.Fatal(err)
}
if len(inputs)!=len(result){
t.Fatal("1-return data num error")
}
if result[0] {
t.Fatal("1-1failed")
}
if result[1] {
t.Fatal("1-2failed")
}
//到这里说明第一个已经通过
t.Log(result)
names:=[]string{"曹操","孙权","孙权","hello"}
resultNames,err:=Client(names)
if err!=nil{
t.Fatal(err)
}
if len(names)!=len(resultNames){
t.Fatal("2-return data num error")
}
if resultNames[0] {
t.Fatal("2-1failed")
}
if resultNames[1] {
t.Fatal("2-2failed")
}
if !resultNames[2] {
t.Fatal("2-3failed")
}
if !resultNames[3] {
t.Fatal("2-4failed")
}
//到这里说明第二个已经通过
t.Log(resultNames)
}