前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >net.Dial与net.Listen

net.Dial与net.Listen

作者头像
TomatoCool
发布2023-07-31 15:13:14
4430
发布2023-07-31 15:13:14
举报
文章被收录于专栏:TomatoCoolTomatoCool

net.Dial

作用

net.Dial能够使用特定协议建立连接,如果成功建立,则返回一个Conn接口

源码

代码语言:javascript
复制
func Dial(network, address string) (Conn, error) {
    var d Dialer
    return d.Dial(network, address)
}

使用方法

建立TCP连接

代码语言:javascript
复制
conn, err := net.Dial("tcp", "ip:port")

建立UDP连接

代码语言:javascript
复制
conn, err := net.Dial("udp", "ip:port")

建立其它连接

代码语言:javascript
复制
conn, err := net.Dial(network, "0.0.0.0:9999")

其中network可以是以下协议

  • "tcp"
  • "tcp4" (IPv4-only)
  • "tcp6" (IPv6-only)
  • "udp"
  • "udp4" (IPv4-only)
  • "udp6" (IPv6-only)
  • "ip"
  • "ip4"(IPv4-only)
  • "ip6" (IPv6-only)
  • "unix"
  • "unixgram"
  • "unixpacket"

net.Listen

作用

net.Listen能够监听本地端口,接收特定协议建立的连接,如果成功接收,则返回一个Listener接口

源码

代码语言:javascript
复制
func Listen(network, address string) (Listener, error) {
    var lc ListenConfig
    return lc.Listen(context.Background(), network, address)
}

使用方法

监听TCP连接

代码语言:javascript
复制
listen, err := net.Listen("tcp", "127.0.0.1:port")

监听UDP连接

代码语言:javascript
复制
listen, err := net.Listen("udp", "127.0.0.1:port")

监听其它连接

代码语言:javascript
复制
listen, err := net.Listen(network, "127.0.0.1:port")

其中network可以是以下协议

  • "tcp"
  • "tcp4"
  • "tcp6"
  • "unix"
  • "unixpacket"

Listener接口

作用

Listener是一个网络监听接口,不同的协程可以调用同一个Listener上的方法

源码

代码语言:javascript
复制
type Listener interface {
    Accept() (Conn, error)
    Close() error
    Addr() Addr
}

接口方法

  • Accept():返回一个Conn接口建立连接
  • Close():关闭监听,任何阻塞的Accept操作将被解除阻塞并返回错误,即关闭所有已经建立的连接
  • Addr():返回监听的网络地址

Conn接口

作用

Conn是一个网络连接接口,不同的协程可以调用同一个Conn上的方法

源码

代码语言:javascript
复制
type Conn interface {
    Read(b []byte) (n int, err error)
    Write(b []byte) (n int, err error)
    Close() error
    LocalAddr() Addr
    RemoteAddr() Addr
    SetDeadline(t time.Time) error
    SetReadDeadline(t time.Time) error
    SetWriteDeadline(t time.Time) error
}

接口方法

  • Read(b []byte):将接收到的数据读取到b中,返回数据长度和错误信息
  • Write(b []byte):将b中的数据发送出去,返回数据长度和错误信息
  • Close():关闭连接
  • LocalAddr():返回本地网络地址
  • RemoteAddr():返回远程连接地址
  • SetDeadline(t time.Time):设置超时时间,如果某段时间未进行读写操作,则返回错误信息,设置位0永不超时
  • SetReadDeadline(t time.Time):单独设置读操作的超时时间
  • SetWriteDeadline(t time.Time):单独设置写操作的超时时间

简易TCP服务

客户端

代码语言:javascript
复制
package main

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

func main() {
    //  建立conn连接
    conn, err := net.Dial("tcp", "127.0.0.1:8888")
    //  错误处理
    if err != nil {
        fmt.Println(err)
        return
    }
    //  程序执行完后关闭连接
    defer conn.Close()
    //  能够从键盘获取输入的接口
    inputReader := bufio.NewReader(os.Stdin)
    //  循环监听conn
    for {
        //  读取键盘输入
        readString, _ := inputReader.ReadString('\n')
        //  去除读取到的换行
        trim := strings.Trim(readString, "\r\n")
        //  发送信息
        _, err := conn.Write([]byte(trim))
        //  错误处理
        if err != nil {
            fmt.Println(err)
            return
        }
        //  读取返回信息
        buf := [512]byte{}
        n, err := conn.Read(buf[:])
        //  错误处理
        if err != nil {
            fmt.Println(err)
            return
        }
        //  输出返回信息
        fmt.Println(string(buf[:n]))
    }

}

服务端

代码语言:javascript
复制
package main

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

func main() {
    //  监听端口
    listen, err := net.Listen("tcp", "127.0.0.1:8888")
    //  错误处理
    if err != nil {
        fmt.Println(err)
        return
    }
    //  循环监听listen
    for {
        //  建立conn连接
        conn, err := listen.Accept()
        //  错误处理
        if err != nil {
            fmt.Println(err)
            return
        }
        //  程序执行完后关闭连接
        defer conn.Close()
        //  循环监听conn
        for {
            //  能够从conn获取输入的接口
            reader := bufio.NewReader(conn)
            //  从conn中读取输入
            var buf [1024]byte
            read, err := reader.Read(buf[:])
            //  错误处理
            if err != nil {
                fmt.Println(err)
                return
            }
            //  保存从conn中读取的信息
            recv := string(buf[:read])
            //  输出recv
            fmt.Println("GET MESSAGE: ", recv)
            //  向客户端返回信息
            conn.Write([]byte(recv))
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023 年 07 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • net.Dial
    • 作用
      • 源码
        • 使用方法
        • net.Listen
          • 作用
            • 源码
              • 使用方法
              • Listener接口
                • 作用
                  • 源码
                    • 接口方法
                    • Conn接口
                      • 作用
                        • 源码
                          • 接口方法
                          • 简易TCP服务
                            • 客户端
                              • 服务端
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档