专栏首页Golang语言社区go语言网络编程之tcp

go语言网络编程之tcp

go语言网络编程需要导入包 net如下 import ( "fmt" "net" ) 重要函数 func Listen(net, laddr string) (Listener, error) func Accept() (c Conn, err error) func Read(b []byte) (n int, err error) 好,我们先写一个go服务器端。 编程之前,先来了解下go语法,熟悉的跳过此段。 go的变量声明比较怪,和c的声明“相反” c语言的声明是这样的 int a; go语言的声明是这样的 var a int; 如果无视var这个标志,你会就是“相反”。 而且你声明不使用会报错,在go中。 go语言的多变量赋值, i:=1 等价于刚才说明的 var i int = 1,下面的i,j赋值会自动匹配 i=1,j=1 i, j := 1, 1 i = i + j 恩,这个多变量赋值的这个东西,在函数返回值有多变量的用上。对,go语言函数可以返回多个值⊙﹏⊙ 和lua语言相似。 go语言的函数实现如下所示,函数形参的声明不用带上var func test(r string, err string){ return r err } i,j:=test("1","2"); go语言的for和if if和for 一样,可以在条件之前执行一个简单的语句,用分号相隔,由这个语句定义的变量的作用域仅在 if 范围之内。 如下所示 if y:=5;y==5 {//如果y=5则输出y fmt.Println(y) } go语言defer的使用,代码例子如下 file.Open("C:/test.txt") defer file.Close() 作用:在函数退出时调用,这样就有效避免了C语言中的内存泄露问题. 下面大家可以看看超级简单的tcp服务器端的代码

package main
import (
    "net"
    "fmt"
)
func main() {


        server, err := net.Listen("tcp", ":7777")
        if err == nil { //若果err为nil,则成功创建
            for {
                con, error_ := server.Accept()
                fmt.Println("有一个客户连接\n")
                if error_ == nil {
                    con.Write([]byte("hello world!"))
                }
            }
        } else {
            return
        }

}

下面则是客户端的代码

    conn, err := net.Dial("tcp", "127.0.0.1:7777")
        if err == nil {
            for {
                buf := make([]byte, 1024)
                if length, err := conn.Read(buf); err == nil {
                    if length > 0 {
                        buf[length] = 0
                        fmt.Printf("%s", string(buf[0:length]))
                    }
                }
            }
        } else {
            return
        }

整合在一起就是以下代码

if os.Args[1] == "server" {
        server, err := net.Listen("tcp", ":7777")
        if err == nil { //若果err为nil,则成功创建
            for {
                con, error_ := server.Accept()
                fmt.Println("有一个客户连接\n")
                if error_ == nil {
                    con.Write([]byte("hello world!"))
                }
            }
        } else {
            return
        }
    } else {
        conn, err := net.Dial("tcp", "127.0.0.1:7777")
        if err == nil {
            for {
                buf := make([]byte, 1024)
                if length, err := conn.Read(buf); err == nil {
                    if length > 0 {
                        buf[length] = 0
                        fmt.Printf("%s", string(buf[0:length]))
                    }
                }
            }
        } else {
            return
        }
    }

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-12-25

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • go语言网络编程之tcp

    go语言网络编程需要导入包 net如下 import ( "fmt" "net" ) 重要函数 func Listen(net, laddr s...

    李海彬
  • Golang语言社区--golang 进度下载文件

    大家好,我是Golang社区主编彬哥,本篇给大家转载一篇关于文件下载相关的文章。

    李海彬
  • Golang RSA加密解密程序

    package main import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem" ...

    李海彬
  • go语言网络编程之tcp

    go语言网络编程需要导入包 net如下 import ( "fmt" "net" ) 重要函数 func Listen(net, laddr s...

    李海彬
  • Golang语言社区--golang 进度下载文件

    大家好,我是Golang社区主编彬哥,本篇给大家转载一篇关于文件下载相关的文章。

    李海彬
  • kube-proxy源码解析

    ipvs相对于iptables模式具备较高的性能与稳定性, 本文讲以此模式的源码解析为主,如果想去了解iptables模式的原理,可以去参考其实现,架构上无差别...

    sealyun
  • 【VBS】vbs指定编码保存文本文件(含xml、ini什么的)

    - 让用户填写一些信息,待安装完成后把这些信息写入软件安装目录中的指定ini、xml文件中

    AhDung
  • go笔记:go发起http get请求

    超级大猪
  • Java程序员转行大数据,如何达到年薪30万!

    为何要选大数据? 本人学生时代学的Java入门技术,主要还是Web方向的。 目前工作将近两年,已经接触到的东西包括一般网站开发的Servlet/JSP、JPA、...

    Java技术栈
  • 不会修电视机的程序员不是好修理工

    大姑:哦,好吧。。。(此刻心里的想法可能是:这娃肯定是学校成绩不好,没学到东西,在找借口)

    Bruce Li

扫码关注云+社区

领取腾讯云代金券