golang Socket服务三次握手

本文详细介绍了如何使用Golang实现Socket服务的三次握手过程,并展示了服务端和客户端的代码示例。在通信过程中,客户端发送信息给服务端,服务端接收并反馈,确保通信成功。此外,还探讨了如何在通信中加入自定义协议,以增强数据的处理能力。通过封装和解析协议,实现了更复杂的网络通信功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三次握手的过程:

    首先,客户端对服务器发送了条信息。

    然后,服务端对客户端说,我收到了。

    最后,客户端对服务端说,好的,我知道你收到了。

 

   服务端,我们先声明本地要监听的地址和端口:

netListent, err := net.Listen("tcp", "localhost:7373")

   有开始就有结束,当主函数运行结束时,需要释放资源。

 

defer netListent.Close()

   在服务端做标记,表明现在开始等待客户端访问了。

 

Log(time.Now().Format("2006-01-02 15:04:05.0000000"),"Waiting for client ...")

   监听是一个不停息的循环运行。所以使用for{}

for{
    conn, err := netListent.Accept()
    if err != nil{
        continue
    }
    //标记发生了一次连接
    Log(conn.RemoteAddr().String(), "tcp connect success")
    go handleConnection(conn)
}

 

   每个从客户端请求的连接,都会在服务端生成一个goroutine协程去处理。

go handleConnection(conn)

 

   服务端处理的过程是这样的。建立一个缓存,接收客户端信息。如果接收正确,就反馈给客户端说"我收到了"。如果客户端没有反应,就证明客户端"没有收到回执"。如果客户端有反馈,就说明"客户端收到回执"。

 

   最后,沟通结束,释放连接资源。defer con.Close()

//客户端连接处理
func handleConnection(conn net.Conn) {
    buffer := make([]byte, 1024)
    for{
        //接收客户端信息
        msg, err := conn.Read(buffer)
        if err != nil{
            //接收错误,日志打印
            Log(conn.RemoteAddr().String(), "connection error: ", err)
            return
        }
        //接收正确,日志打印
        Log(conn.RemoteAddr().String(), "receive data: ", string(buffer[:msg]))
        //反馈给客户端
        bufferReturn := "我收到了"
        msgR, err2 := conn.Write([]byte(bufferReturn))
        //确认客户端未收到回执
        if err2 != nil{
            Log(conn.RemoteAddr().String(), "没有收到回执")
            return
        }
        //确认客户端收到回执
        msg, err = conn.Read(buffer)
        Log(conn.RemoteAddr().String(), "客户端收到回执", string(buffer[:msg]), "客户收到了", msgR, ";实际发送了", len(bufferReturn))
    }
    defer conn.Close()
}

   其中应用到的日志记录和错误处理。

 

 

//日志记录
func Log(i ...interface{}) {
    fmt.Println(i...)
    return
}
//错误处理
func CheckErr(err error) {
    if err != nil{
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
}

 

 

完整的服务端代码示例

/**
* MySocketProtocolServer
* @Author:  Jian Junbo
* @Email:   junbojian@qq.com
* @Create:  2017/9/15 9:07
* Copyright (c) 2017 Jian Junbo All rights reserved.
*
* Description:  服务端 Socket 信息接收
*/
package main

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

func main() {
    //监听服务声明实例化
    netListent, err := net.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值