通过unix socket建立http连接

Posted 柳清风09

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过unix socket建立http连接相关的知识,希望对你有一定的参考价值。

除了我们熟知的tcp连接以外还可以通过本地socket建立通信,Unix Domain Socket的英文简称是UDS,就是一种常用的方式,但它只支持建立本地连接,它的好处是通过路径而非端口建立连接,好处是可以避免端口占用。

首先看服务端代码

package main

import (
	"fmt"
	"net"
	"net/http"
	"os"
)

func main() 
	if len(os.Args) < 2 
		fmt.Fprintln(os.Stderr, "usage:", os.Args[0], "/path.sock [wwwroot]")
		return
	

	fmt.Println("Unix HTTP server")

	root := "."
	if len(os.Args) > 2 
		root = os.Args[2]
	

	os.Remove(os.Args[1])

	server := http.Server
		Handler: http.FileServer(http.Dir(root)),
	
	//如果是tcp连接,参数是tcp 以及端口
	//如果是uds连接,参数是unix以及路径
	unixListener, err := net.Listen("unix", os.Args[1])
	if err != nil 
		panic(err)
	
	server.Serve(unixListener)

启动服务端

echo "kkk"> aa
go run s.go /var/abc

客户端代码

package main

import (
	"context"
	"flag"
	"fmt"
	"io"
	"net"
	"net/http"
	"os"
	"strings"
)

func main() 
	post := flag.String("d", "", "data to POST")
	help := flag.Bool("h", false, "usage help")
	flag.Parse()

	if *help || len(flag.Args()) != 2 
		fmt.Fprintln(os.Stderr, "usage:", os.Args[0], "[-d data] /path.socket /uri")
		flag.PrintDefaults()
		os.Exit(0)
	

	fmt.Println("Unix HTTP client")

	httpc := http.Client
		Transport: &http.Transport
			DialContext: func(_ context.Context, _, _ string) (net.Conn, error) 
				return net.Dial("unix", flag.Args()[0]) //uds 路径
			,
		,
	

	var response *http.Response
	var err error
	if len(*post) == 0 
		response, err = httpc.Get("http://unix" + flag.Args()[1])//url路径
	 else 
		response, err = httpc.Post("http://unix"+flag.Args()[1], "application/octet-stream", strings.NewReader(*post))
	

	if err != nil 
		panic(err)
	
	io.Copy(os.Stdout, response.Body)

# go run c.go -d "bb"  /var/abc /aa

Unix HTTP client
kkk

可以正确的获取server端文件内容!大功告成!

以上是关于通过unix socket建立http连接的主要内容,如果未能解决你的问题,请参考以下文章

socket与http的区别

Linux网络编程简单示例

HTTP,TCP,Socket

socket中close()和shutdown()区别

Python socket通信~简单实例

再次温习 socket http tcp