go服务端 使用 microSocket
package main
import (
"encoding/json"
"log"
"net"
msf "github.com/mistaker/microSocket"
)
var ser = msf.NewMsf(&msf.CommSocket{})
//框架事件
//----------------------------------------------------------------------------------------------------------------------
type event struct {
}
//客户端握手成功事件
func (this event) OnHandel(fd uint32, conn net.Conn) bool {
log.Println(fd, "链接成功类")
return true
}
//断开连接事件
func (this event) OnClose(fd uint32) {
log.Println(fd, "链接断开类")
}
//接收到消息事件
func (this event) OnMessage(fd uint32, msg map[string]string) bool {
/*接收数据 module:test|action:Hello|method:Downpower|data:1111*/
log.Println("这个是接受消息事件",msg)
resData :=map[string]string{
"key":msg["module"],
"val":"Hello",
}
stu,_ := json.Marshal(&resData)
a := []byte(string(stu))
/*响应json字符串 {"key":"test","val":"Hello"}*/
ser.SessionMaster.WriteByid(fd,a)
return true
}
//----------------------------------------------------------------------------------------------------------------------
//框架业务逻辑
type Task struct {
}
func (this Task) Default(fd uint32,data map[string]string) bool {
log.Println("default")
return true
}
func (this Task) BeforeRequest(fd uint32,data map[string]string) bool {
log.Println("before")
return true
}
func (this Task) AfterRequest(fd uint32,data map[string]string) bool{
log.Println("after")
return true
}
func (this Task) Hello(fd uint32,data map[string]string) bool {
log.Println("收到消息了")
log.Println(data)
ser.SessionMaster.WriteByid(fd,[]byte("hehehehehehehehe"))
return true
}
func (this Task) Hs(fd uint32,data map[string]string) bool {
resData :=map[string]string{
"key":data["module"],
"val":"Hello,World!",
}
stu,_ := json.Marshal(&resData)
a := []byte(string(stu))
/*响应json字符串 {"key":"test","val":"Hello"}*/
ser.SessionMaster.WriteByid(fd,a)
//ser.SessionMaster.WriteByid(fd,[]byte("Hello,World!"))
//ser.SessionMaster.DelSessionById(fd) //关闭连接
return true
}
//----------------------------------------------------------------------------------------------------------------------
func main() {
log.SetFlags(log.Lshortfile | log.LstdFlags | log.Llongfile)
ser.EventPool.RegisterEvent(&event{})
ser.EventPool.RegisterStructFun("ts", &Task{})
ser.Listening(":6565")
//go ser.Listening(":6565")
}
go客户端
package main
import (
//"encoding/json"
"fmt"
_ "fmt"
"net"
ms "github.com/mistaker/microSocket"
"github.com/mistaker/microSocket/util"
)
func main() {
conn, err := net.Dial("tcp", "192.168.199.59:6565")
if err != nil {
return
}
// defer conn.Close()
data := make(map[string]string)
data["module"] = "ts"
data["method"] = "Hs"
sock := &ms.CommSocket{}
data["data"] = "1111"
//把map转化为string
a := []byte(util.Map2String(data))
//把string打包
//sock := &ms.CommSocket{}
b := sock.Pack(a)
fmt.Println(b)
//发送数据
conn.Write(b)
/*接受响应数据*/
buff := make([]byte, 1000000)
n,redErr :=conn.Read(buff)
if redErr !=nil{
fmt.Println("Read failed:", redErr)
}
if string(buff[:6]) != "Header" {/*如果header不是 指定的header 说明此数据已经被污染 直接不要*/
fmt.Println("Read Header Err !")
}
if len(buff) < 10 {/*包头有10个字节占位 Header+空字节*/
fmt.Println("pack Header Err !")
}
fmt.Println(string(buff[10:n]))
}
php客户端测试
<?php
ini_set('display_errors',1);
set_time_limit(0);
$data ="module:ts|method:Hello";/*首次请求携带参数*/
$data1 ="module:ts|method:Hs|data:333333";/*发送消息*/
$result ="Header".pack('N', strlen($data)).$data;
$host = "192.168.199.59";
$port = 6565;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create socket\n");
$connection = socket_connect($socket, $host, $port) or die("Could not connet server\n");
socket_write($socket, $result) or die("Write failed\n");
//sleep(5); //机器运算要比网络传输快几百倍,服务器还没有返回数据呢就已经开始运行了,当然就收的是空值了
$i =0;
while ($buff = socket_read($socket, 10240000)) {
if ($i >= 3){break;}
echo("Response was:" . $buff . "\n");
echo("input what you want to say to the server:\n");
$result1 ="Header".pack('N', strlen($data1)).$data1;
socket_write($socket, $result1);
$i ++;
}
socket_close($socket);