IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> swoole客户端与go服务端tcp通讯 -> 正文阅读

[网络协议]swoole客户端与go服务端tcp通讯

为防止粘包使用了16位的标志位来进行分包

php做客户端使用的同步的tcp

$client = new swoole_client(SWOOLE_SOCK_TCP);

if (!$client->connect('127.0.0.1', 3333, -1)){
    exit("connect failed. Error: {$client->errCode}\n");
}

$context = "hello world 1";
$len = pack("n", strlen($context));
$send = $len . $context;

$context = "hello world 2";
$len = pack("n", strlen($context));
$send .= $len . $context;

$client->send($send);
echo $client->recv();

go做服务端

package main

import (
	"bufio"
	"bytes"
	"encoding/binary"
	"errors"
	"fmt"
	"net"
)

func main() {
	fmt.Println("服务端启动")

	ln, err := net.Listen("tcp", "0.0.0.0:3333")
	if err != nil {
		fmt.Println("TCP监听错误", err)
	}
	for {
		conn, err := ln.Accept()
		if err != nil {
			fmt.Println("TCP接收数据错误", err)
		}
		go handler(conn)
	}
}

func handler(conn net.Conn) {
	defer conn.Close()
	reader := bufio.NewReader(conn)
	for {
		msg, err := unpack(reader)
		if err!=nil {
			fmt.Println("解包失败", err)
			return
		}
		fmt.Println("接收到数据:", string(msg))
		_, err = conn.Write([]byte("我是服务器\n"))
		if err != nil {
			fmt.Println("写入数据失败", err)
			return
		}
	}
}


func unpack(reader *bufio.Reader) (string, error) {
	lenByte, _ := reader.Peek(2)
	lengthBuff := bytes.NewBuffer(lenByte)
	var length int16
	err := binary.Read(lengthBuff, binary.BigEndian, &length)
	if err != nil {
		return "", err
	}
	if int16(reader.Buffered()) < length+2 {
		return "", errors.New("数据异常")
	}
	pack := make([]byte, int(length+2))
	_, err = reader.Read(pack)
	if err != nil {
		return "", err
	}
	return string(pack[2:]), nil
}

补充一个go版本client

package main

import (
	"bytes"
	"encoding/binary"
	"fmt"
	"net"
	"strconv"
	"time"
)

func main() {
	conn, err := net.Dial("tcp", ":3333")
	if err != nil {
		fmt.Println("err", err)
		return
	}
	fmt.Println("go客户端建立连接成功")
	defer conn.Close()
	var data []byte
	for i := 0; i < 3; i++ {
		msg := "我是client" + strconv.Itoa(i)
		length := int32(len(msg))
		var buffer bytes.Buffer
		_ = binary.Write(&buffer, binary.BigEndian, &length)
		data = append(data, append(buffer.Bytes(), []byte(msg)...)...)
	}
	conn.Write(data)
	n, _ := conn.Read(data[:])
	fmt.Println(string(data[:n]))
	time.Sleep(1e9)
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:49:27  更:2021-08-01 14:49:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 6:27:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码