golang实现简单的tcp通信

简单代码

服务端

复制代码
//Server.go
package main

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

func main(){

    //服务端在本机8888端口建立tcp监听

    listener,err :=net.Listen("tcp","127.0.0.1:8888")
    ServerHandleError(err,"net.listen")



    for {
        //循环接入所有客户端得到专线连接
        conn,e := listener.Accept()
        ServerHandleError(e,"listener.accept")
        //开辟独立协程与该客聊天
        go ChatWith(conn)
    }


}

func ServerHandleError(err error,when string) {
    if err != nil {
        fmt.Println(err, when)
        os.Exit(1)
    }
}

//在conn网络专线中与客户端对话
func ChatWith(conn net.Conn){

    //创建消息缓冲区
    buffer := make([]byte, 1024)
    for {
        ///---一个完整的消息回合


        //读取客户端发来的消息放入缓冲区
        n,err := conn.Read(buffer)
        ServerHandleError(err,"conn.read buffer")

        //转化为字符串输出
        clientMsg := string(buffer[0:n])
        fmt.Printf("收到消息",conn.RemoteAddr(),clientMsg)


        //回复客户端消息
        if clientMsg != "im off" {
            conn.Write([]byte("已读:"+clientMsg))
        } else {
            conn.Write([]byte("bye"))
            break
        }
    }
    conn.Close()
    fmt.Printf("客户端断开连接",conn.RemoteAddr())

}
复制代码

客户端

复制代码
//Client.go
package main

import (
    "bufio"
    "fmt"
    "net"
    "os"
)

func ClientHandleError(err error, when string){
    if err != nil {
        fmt.Println(err, when)
        os.Exit(1)
    }

}


func main(){

    //拨号远程地址,简历tcp连接
    conn, err := net.Dial("tcp","127.0.0.1:8888")
    ClientHandleError(err, "client conn error")

    //预先准备消息缓冲区
    buffer := make([]byte,1024)


    //准备命令行标准输入
    reader := bufio.NewReader(os.Stdin)

    for {
        lineBytes,_,_ := reader.ReadLine()
        conn.Write(lineBytes)
        n,err := conn.Read(buffer)
        ClientHandleError(err, "client read error")

        serverMsg := string(buffer[0:n])
        fmt.Printf("服务端msg",serverMsg)
        if serverMsg == "bye" {
            break
        }

    }

}
复制代码

 

简单测试

客户端发消息

 

服务端读消息

 

posted @   温柔的风  阅读(5286)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2018-02-05 PHP实现多进程并行操作,可做守护进程(转,备用)
2018-02-05 php多进程结合Linux利器split命令实现把大文件分批高效处理
2018-02-05 Centos文件切割利器_split命令及cat命令合并文件
点击右上角即可分享
微信分享提示