Go语言服务器开发之简易TCP客户端与服务端实现方法

Go语言具备强大的服务器开发支持,这里示范了最基础的服务器开发:通过TCP协议实现客户端与服务器的通讯。

一 服务端,为每个客户端新开一个goroutine

代码如下:func ServerBase() {  
    fmt.Println("Starting the server...")  
    //create listener  
    listener, err := net.Listen("tcp", "192.168.1.27:50000")  
    if err != nil {  
        fmt.Println("Error listening:", err.Error())  
        return  
    }  
 
    // listen and accept connections from clients:  
    for {  
        conn, err := listener.Accept()  
        if err != nil {  
            fmt.Println("Error accepting:", err.Error())  
            return  
        }  
        //create a goroutine for each request.  
        go doServerStuff(conn)  
    }  
}  
 
func doServerStuff(conn net.Conn) {  
    fmt.Println("new connection:", conn.LocalAddr())  
    for {  
        buf := make([]byte, 1024)  
        length, err := conn.Read(buf)  
        if err != nil {  
            fmt.Println("Error reading:", err.Error())  
            return  
        }  
 
        fmt.Println("Receive data from client:", string(buf[:length]))  
    }  
}
二 客户端 连接服务器,并发送数据
代码如下:func ClientBase() {  
    //open connection:  
    conn, err := net.Dial("tcp", "192.168.1.27:50000")  
    if err != nil {  
        fmt.Println("Error dial:", err.Error())  
        return  
    }  
 
    inputReader := bufio.NewReader(os.Stdin)  
    fmt.Println("Please input your name:")  
    clientName, _ := inputReader.ReadString('/n')  
    inputClientName := strings.Trim(clientName, "/n")  
 
    //send info to server until Quit  
    for {  
        fmt.Println("What do you send to the server? Type Q to quit.")  
        content, _ := inputReader.ReadString('/n')  
        inputContent := strings.Trim(content, "/n")  
        if inputContent == "Q" {  
            return  
        }  
 
        _, err := conn.Write([]byte(inputClientName + " says " + inputContent))  
        if err != nil {  
            fmt.Println("Error Write:", err.Error())  
            return  
        }  
    }  
}

注:由于LiteIDE不支持同时运行多个程序,所以需要在终端通过 go run 命令来同时运行服务端和(一个或多个)客户端,可观察到服务器对并发访问的支持。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

基于vue2.0+vuex+localStorage开发的本地记事本

本文采用vue2.0+vuex+localStorage+sass+webpack,实现一个本地存储的记事本。兼容PC端和移动端。 在线预览地址:DEMO 功能...

29960
来自专栏BY的专栏

iOS开启热点或定位时状态栏变化导致布局改变

55050
来自专栏CDA数据分析师

让你效率提高300%的Excel键盘技巧

本文为简书作者傲看今朝原创,CDA数据分析师已获得授权 刚进惠普的时候,听说公司里的某个领导操作Excel从不用鼠标,感觉真是太牛逼了,满是崇拜的眼神。然而经过...

21780
来自专栏Youngxj

微信内置浏览器自动跳转其它浏览器

7K60
来自专栏技术博客

ExtJs八(ExtJs Mvc创建ViewPort续)

现在要考虑的是如何加载标签页内的内容。虽然标签页默认是延迟渲染的(deferredRender值默认为true),但是它会预加载所有的类,因而当类文件很多的时候...

9010
来自专栏Core Net

微信小程序:动画(Animation)

官方文档是这样说的:①创建一个动画实例 animation。②调用实例的方法来描述动画。③最后通过动画实例的 export 方法导出动画数据传递给组件的 ani...

2.5K10
来自专栏北京马哥教育

最全整理 | 121个Ubuntu终端常用快捷键

Ubuntu中的许多操作在终端(Terminal)中十分的快捷,记住一些快捷键的操作更得心应手。在Ubuntu中打开终端的快捷键是Ctrl+Alt+T。其他的一...

337120
来自专栏前端人人

React第三方组件2(状态管理之Refast的使用②异步修改state)

本教程总共5篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React第三方组件2(状态管理之Refast的使用①...

27930
来自专栏小文博客

为你的博客图片加水印吧——WaterMark(汉化)

21930
来自专栏北京马哥教育

[来稿]pycharm快捷键、tips、常用设置及版本控制 制

在PyCharm安装目录 /opt/pycharm-3.4.1/help目录下可以找到ReferenceCard.pdf快捷键英文版说明 or 打开pychar...

51880

扫码关注云+社区

领取腾讯云代金券