golang 使用unixsocket交换数据 socket

// author songaimin@outlook.com 20170623
// golang 使用unixsocket交换数据
// 单元测试示例:
// package utils

// import (
// "fmt"
// u "lpaiche.com/utils"
// // "os"
// "testing"
// "time"
// )

// func TestServer(t *testing.T) {
// //声明unixsocket
// us := u.NewUnixSocket("/tmp/us.socket")
// //设置服务端接收处理
// us.SetContextHandler(func(context string) string {
// fmt.Println(context)
// now := time.Now().String() + "sssssss"
// return now
// })
// //开始服务
// go us.StartServer()
// time.Sleep(time.Second * 30)
// }

// func TestClient(t *testing.T) {
// //声明unixsocket
// us := u.NewUnixSocket("/tmp/us.socket")
// //发送数据unixsocket并返回服务端处理结果
// r := us.ClientSendContext("eeeeeee")
// fmt.Println("===============" + r)
// }

package utils

import (
    "fmt"
    "net"
    "os"
    "time"
)

type UnixSocket struct {
    filename string
    bufsize  int
    handler  func(string) string
}

func NewUnixSocket(filename string,size ...int) *UnixSocket {
    size1 := 10480
    if size != nil {
        size1 = size[0]
    }
    us := UnixSocket{filename: filename,bufsize: size1}
    return &us
}

func (this *UnixSocket) createServer() {
    os.Remove(this.filename)
    addr,err := net.ResolveUnixAddr("unix",this.filename)
    if err != nil {
        panic("Cannot resolve unix addr: " + err.Error())
    }
    listener,err := net.ListenUnix("unix",addr)
    defer listener.Close()
    if err != nil {
        panic("Cannot listen to unix domain socket: " + err.Error())
    }
    fmt.Println("Listening on",listener.Addr())
    for {
        c,err := listener.Accept()
        if err != nil {
            panic("Accept: " + err.Error())
        }
        go this.HandleServerConn(c)
    }

}

//接收连接并处理
func (this *UnixSocket) HandleServerConn(c net.Conn) {
    defer c.Close()
    buf := make([]byte,this.bufsize)
    nr,err := c.Read(buf)
    if err != nil {
        panic("Read: " + err.Error())
    }
    // 这里,你需要 parse buf 里的数据来决定返回什么给客户端
    // 假设 respnoseData 是你想返回的文件内容
    result := this.HandleServerContext(string(buf[0:nr]))
    _,err = c.Write([]byte(result))
    if err != nil {
        panic("Writes Failed.")
    }
}

func (this *UnixSocket) SetContextHandler(f func(string) string) {
    this.handler = f
}

//接收内容并返回结果
func (this *UnixSocket) HandleServerContext(context string) string {
    if this.handler != nil {
        return this.handler(context)
    }
    now := time.Now().String()
    return now
}

func (this *UnixSocket) StartServer() {
    this.createServer()
}

//客户端
func (this *UnixSocket) ClientSendContext(context string) string {
    addr,this.filename)
    if err != nil {
        panic("Cannot resolve unix addr: " + err.Error())
    }
    //拔号
    c,err := net.DialUnix("unix",nil,addr)
    if err != nil {
        panic("DialUnix Failed.")
    }
    //写出
    _,err = c.Write([]byte(context))
    if err != nil {
        panic("Writes Failed.")
    }
    //读结果
    buf := make([]byte,err := c.Read(buf)
    if err != nil {
        panic("Read: " + err.Error())
    }
    return string(buf[0:nr])
}

相关文章

程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息...
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简...
简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其...
接下来学习并发编程, 并发编程是go语言最有特色的地方, go对并发编程是原生支持. goroutine是go中最近本...
先普及一下, 什么是广度优先搜索 广度优先搜索类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶...
第一天: 接口的定义和实现 第二天: 一. go语言是面向接口编程. 在学习继承的时候说过, go语言只有封装,...