golang 网络编程(2)TCP

zidea · · 897 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang_real.jpg

TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

说到网络编程我们先理解一个术语套接字,突破这个术语,我们就向理解 TCP 迈出了一大步。简单比喻一下吧,我们彼此间通过打电话或写信的进行哪种不是面对面的交流,套接字就是我们进行这些交流工具,电话机或是邮箱,仅此而已。

我们今天用 go 语言实现一个 TCP 通讯,go 语言对 TCP 进行封装来方便我们开发 TCP 服务。

package main

import(
    "fmt"
    "io"
    "net"
    "time"
)

func main()  {
    ln, err := net.Listen("tcp",":9000")
    if err != nil{
        panic(err)
    }
    defer ln.Close()

    for{
        conn, err := ln.Accept()
        if err != nil{
            panic(err)
        }

        io.WriteString(conn, fmt.Sprint("Hello World\n",time.Now(),"\n"))

        conn.Close()
    }
}

我们创建 TCP 服务,监听本地的 9000 端口,看一下 Listen 方法具体做了什么,我们查看一下 Listen 的源码,Listen 方法接收 net 和 laddr 两个参数,然后返回一个 Listener 和 error 对象。listen表示服务已经就绪可以接受请求,但是不等于已经连接上服务。这是请求连接的客户端的请求还处于请求等待中。

conn, err := ln.Accept()

表示接受客户端的请求,返回 socket 套接字连接,向客户端写入数据。

func Listen(net, laddr string) (Listener, error){
}
type Listener interface{
  Accept(){ c Conn, err error}
  Close()
  Addr()
}

继续查看返回的 Listener 接口提供了 Close、Accept 和 Addr 三个方法。在上面的代码中 defer ln.Close() 我们调用了其Close 方法表示最终将关闭服务。
在 for 循环中,在 go 语言中没有 while 和 do-while ,只有 for 在没有任何条件就是表示无限循环。在循环体中调用ln.Accept()方法来获取连接对象 connect

type Conn interface{
  Read(b []byte) (n int, err error)
 ...
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:zidea

查看原文:golang 网络编程(2)TCP

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

897 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传