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 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

前端魔法堂——异常不仅仅是try/catch

前言  编程时我们往往拿到的是业务流程正确的业务说明文档或规范,但实际开发中却布满荆棘和例外情况,而这些例外中包含业务用例的例外,也包含技术上的例外。对于业务用...

30070
来自专栏Coco的专栏

BAT及各大互联网公司2014前端笔试面试题--JavaScript篇

35550
来自专栏Jerry的SAP技术分享

100行代码让您学会JavaScript原生的Proxy设计模式

面向对象设计里的设计模式之Proxy(代理)模式,相信很多朋友已经很熟悉了。比如我之前写过代理模式在Java中实现的两篇文章:

13510
来自专栏deepcc

用 Function.apply() 的参数数组化来提高 JavaScript程序性能

34750
来自专栏冰霜之地

深入浅出 FlatBuffers 之 Encode

FlatBuffers 的使用和 Protocol buffers 基本类似。只不过功能比 Protocol buffers 多了一个解析 JSON 的功能。

2.6K30
来自专栏大前端_Web

javascript的replace+正则 实现ES6的字符串模版

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

11340
来自专栏菜鸟前端工程师

JavaScript学习笔记015-Promise0Async0try catch

11720
来自专栏逍遥剑客的游戏开发

J2ME 的优化措施

21070
来自专栏懒人开发

AndroidStudio简单使用(二):左侧Structure

上面有说, 可以通过 Alt + 7 快捷键 调出来。 个人觉得, 这个对于查看代码结构,还是很方便的。直接可以看到代码的大体结构。 我们以 android...

39620
来自专栏程序员宝库

JavaScript 深拷贝性能分析

作者:justjavac 链接:https://segmentfault.com/a/1190000013107871 如何在 JavaScript 中拷贝一个...

481130

扫码关注云+社区

领取腾讯云代金券