首页 > 其他分享 >go tcp 同步 请求

go tcp 同步 请求

时间:2024-06-18 10:21:58浏览次数:15  
标签:systemd 同步 err fmt tcp 服务端 设置 go conn

 

 

客户端 服务端 典型的同步请求-响应模型

简单的 Go 示例,展示了如何实现您描述的同步请求-响应模型。客户端会发送一个包,然后等待接收服务器的响应。服务器接收包后处理数据,然后发送处理完成的消息。客户端接收到响应后,再次发送下一个包

 

服务端:

package main

import (
    "bufio"
    "fmt"
    "net"
    "strings"
)

func handleConnection(conn net.Conn) {
    defer conn.Close()
    reader := bufio.NewReader(conn)

    for {
        // 从客户端读取数据
        message, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("Error reading:", err)
            return
        }

        fmt.Printf("Received: %s", message)

        // 处理数据(这里简单的将消息转换为大写)
        response := strings.ToUpper(message)

        // 发送处理后的数据回客户端
        _, err = conn.Write([]byte(response))
        if err != nil {
            fmt.Println("Error writing:", err)
            return
        }
    }
}

func main() {
    listener, err := net.Listen("tcp", ":12345")
    if err != nil {
        fmt.Println("Error starting TCP server:", err)
        return
    }
    defer listener.Close()

    fmt.Println("TCP server listening on port 12345")

    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err)
            return
        }

        go handleConnection(conn)
    }
}

 

客户端:

package main

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

func main() {
    conn, err := net.Dial("tcp", "localhost:12345")
    if err != nil {
        fmt.Println("Error connecting to server:", err)
        return
    }
    defer conn.Close()

    reader := bufio.NewReader(os.Stdin)
    serverReader := bufio.NewReader(conn)

    for {
        // 从标准输入读取数据
        fmt.Print("Enter message: ")
        message, _ := reader.ReadString('\n')

        // 发送数据到服务端
        _, err := conn.Write([]byte(message))
        if err != nil {
            fmt.Println("Error writing to server:", err)
            return
        }

        // 等待服务端响应
        response, err := serverReader.ReadString('\n')
        if err != nil {
            fmt.Println("Error reading from server:", err)
            return
        }

        fmt.Printf("Server response: %s", response)
    }
}

 

 

服务端 文件数量限制 ulimit -n 需要什么时候设置:

1. 在 shell 中临时设置

您可以在启动服务端程序之前在 shell 中临时设置文件描述符限制。这种方法仅对当前的 shell 会话有效,重启后设置会失效。

sh ulimit -n 65536 ./server

2. 在服务管理器中设置

如果您的服务是通过 systemd 管理的,可以在 systemd 服务配置文件中设置文件描述符限制。这种方法对使用 systemd 启动的服务有效,推荐用于生产环境。

编辑 systemd 服务文件

假设您的服务文件是 /etc/systemd/system/myserver.service

ini [Unit] Description=My TCP Server [Service] ExecStart=/path/to/server LimitNOFILE=65536 [Install] WantedBy=multi-user.target

重新加载 systemd 配置并重启服务

sh sudo systemctl daemon-reload sudo systemctl restart myserver.service

3. 在系统级别设置

/etc/security/limits.conf 文件中设置。这种方法会对所有用户生效,适用于需要为所有进程设置统一限制的情况。

编辑 /etc/security/limits.conf

conf * soft nofile 65536 * hard nofile 65536

此配置文件中的设置在用户登录时生效。如果您的服务是由特定用户运行的,可以替换 * 为特定的用户名。

确保 PAM 模块加载了这些设置

/etc/pam.d/common-session/etc/pam.d/common-session-noninteractive 文件中确保有以下一行:

sh session required pam_limits.so

示例:设置服务端文件描述符限制

下面是一个完整的步骤示例,假设您有一个名为 myserver 的服务。

  1. 编辑 systemd 服务文件

    创建或编辑 /etc/systemd/system/myserver.service 文件:

    ini [Unit] Description=My TCP Server [Service] ExecStart=/usr/local/bin/myserver LimitNOFILE=65536 [Install] WantedBy=multi-user.target
  2. 重新加载 systemd 配置并启动服务

    sh sudo systemctl daemon-reload sudo systemctl enable myserver.service sudo systemctl start myserver.service

4. 在程序代码中设置

您还可以在 Go 程序代码中动态设置文件描述符限制,不过这种方法不太常见,因为它可能会受到操作系统和用户权限的限制。

Go 代码示例

go package main import ( "fmt" "golang.org/x/sys/unix" ) func setRlimit() { var rLimit unix.Rlimit rLimit.Max = 65536 rLimit.Cur = 65536 if err := unix.Setrlimit(unix.RLIMIT_NOFILE, &rLimit); err != nil { fmt.Printf("Error setting rlimit: %v\n", err) } } func main() { setRlimit() // 继续初始化并启动您的服务 }

总结

为了确保您的 TCP 服务端可以处理大量并发连接,适当配置文件描述符限制非常重要。最推荐的方法是在 systemd 服务文件中设置 LimitNOFILE 参数,因为它简单且能持久生效。此外,您还可以在 shell 中临时设置、在 /etc/security/limits.conf 文件中设置系统级别的限制,或在程序代码中设置。选择合适的方法取决于您的具体使用场景和需求

参考:

 

标签:systemd,同步,err,fmt,tcp,服务端,设置,go,conn
From: https://www.cnblogs.com/rebrobot/p/18253807

相关文章

  • Django 笔记一
    Django模板标签变量模板语法:view{“HTML变量名”:“views变量名”}HTML{{变量名}}过滤器模板语法:{{变量名|过滤器:可选参数}}模板过滤器可以在变量被显示前修改它,过滤器使用管道字符{{name|lower}}{{name}}变量被过滤器lower处......
  • NoSQLBooster for MongoDB延长-试用期
    mongo的客户端较少,其中NosqlBoosterForMongo算是一个不错的客户端软件,但是他也不是免费的,试用期只有30天。好在这个软件是基于nodejs的。所以我们可以利用npm对这个应用进行解包串改源码,将源码中设置试用期的参数改成足够大,然后再封包,这样我们就能不断的白嫖了。      ......
  • django学习入门系列之第三点《快速了解 CSS》
    文章目录CSS快速了解CSS应用方式在标签上在head标签中写到文件中问题:用Flask框架开发不方便往期回顾CSSCSS专门用来"美化"标签基础CSS,写简单的界面&能看懂&会改就行模块,调整和修改快速了解style这种就叫css样式<imgsrc"..."style="height:100px"/><d......
  • 一分钱不花!本地部署Google最强开源AI大模型Gemma教程
    谷歌发布了轻量级开源系列模型Gemma,其性能强大,可与主流开源模型竞争。通过Ollama可轻松部署Gemma模型,并使用JANAI美化UI界面。显卡在AIGC应用中至关重要,推荐选择性能强、显存大的NVIDIA系列显卡。半个月前,谷歌搞了一波突然袭击,毫无预兆地发布了新一代AI模型Gemma,并宣称这是......
  • 面经梳理-java多线程同步协作
    题目Synchronized和ReentryLock锁锁可以视作访问共享数据的许可证。锁能够保护共享数据以实现线程安全,其作用包括保障原子性、保障可见性和保障有序性。Java平台中的锁包括内部锁(IntrinsicLock)和显式锁(ExplicitLock)。内部锁是通过synchronized关键字实现的;显式锁是通过java.ut......
  • 12、docker-数据卷容器-多个容器之间数据同步----volumes-from
     =========================================================================================测试:让docker02和03继承docker01·三个容器中,如果父容器被删除了,02和03的数据还是会存在的·容器共享的只有做了特殊处理的卷,不是所有的文件都共享,比如下列的volume01和......
  • Web框架,Python框架初识,Django框架初识与安装,
    ⅠWeb框架【一】Web框架本质web框架本质上可以看成是一个功能强大的socket服务端,用户的浏览器可以看成是拥有可视化界面的socket客户端。两者通过网络请求实现数据交互,从架构层面上先简单的将Web框架看做是对前端、数据库的全方位整合#TCP服务端与客户端进行交互的过程#......
  • Windows 中的 csc 服务是指 "Client Side Caching",即客户端缓存服务。这个服务主要用
    Windows中的csc服务是指"ClientSideCaching",即客户端缓存服务。这个服务主要用于离线文件和文件夹的同步,特别是在使用“离线文件”功能时。下面是关于csc服务的一些介绍:功能:csc服务允许用户在离线状态下访问网络共享文件和文件夹。当用户连接到网络时,csc服务会自动将......
  • MongoDB基本操作(Windows)
    本篇博文介绍知识目标   熟悉数据库和集合操作本篇目标   掌握MongoDB的部署掌握文档的插入、更新、删除以及查询操作一、MongoDB的安装部署在浏览器输入网址:www.mongodb.com2.点击“TRYFREE”或“GETSTARTED”按钮,进入MongoDB的下载页面;3.在下载页面......
  • MongoDB分片部署(windows)
    【CSDN博客】MongoDB分片操作详解与实践OS:win10MongoDB:4.4.24伪分布式分片架构从图中可以看出,分片集群中主要由三个部分组成,即分片服务器(Shard)、路由服务器(Mongos)以及配置服务器(ConfigServer)组成。其中,分片服务器有三个,即Shard1、Shard2、Shard3;路由服务器......