Golang TCP网络编程

网络编程介绍

网络编程介绍

  • 网络编程是指通过计算机网络实现程序间通信的一种编程技术,涉及到在不同计算机之间建立连接、传输数据和协议解析等操作。
  • 套接字(Socket)编程是网络编程的一种实现方式,其提供了一种机制,使得应用程序能够通过网络进行数据传输和通信。
  • Go中的net包是标准库中提供的网络编程包,是基于套接字编程的一种实现方式,提供了对TCP、UDP、IP、ICMP、Unix域套接字等常见网络协议的支持,通过net包可以完成创建套接字、建立连接、发送和接收数据等操作,实现网络通信。

TCP网络编程

服务器监听

服务器监听

在Go的net包中,Listen函数用于创建并返回一个网络监听器(Listener),以监听指定网络地址和端口上的连接请求。该函数的函数原型如下:

func Listen(network, address string) (Listener, error)

参数说明:

  • network:用于指定网络类型,其值必须是"tcp", “tcp4”, “tcp6”, “unix"或"unixpacket”。
  • address:用于指定需要被监听的IP地址和端口号,格式为"host:port"。

返回值说明:

  • 第一个返回值:表示创建的网络监听器。
  • 第二个返回值:如果创建网络监听器过程中出错,将返回非nil的错误值。

通过Listen函数创建得到的网络监听器是Listener类型的,该类型是一个接口类型,其定义如下:

type Listener interface {
   
	// Accept waits for and returns the next connection to the listener.
	Accept() (Conn, error)

	// Close closes the listener.
	// Any blocked Accept operations will be unblocked and return errors.
	Close() error

	// Addr returns the listener's network address.
	Addr() Addr
}

Listener接口中各方法说明:

  • Accept方法:从底层获取下一个已经建立好的连接给监听器。
  • Close方法:关闭监听器。
  • Addr方法:返回监听器对应的网络地址(由IP地址和端口号组成)。

当使用Listen函数创建TCP类型的监听器时,其返回的监听器底层具体的类型是TCPListener,其定义如下:

type TCPListener struct {
   
	fd *netFD
	lc ListenConfig
}

TCPListener结构体各字段说明:

  • fd:对底层网络文件描述符的封装,提供了对网络连接的读写和控制操作。
  • lc:用于配置监听器创建的行为,比如设置监听地址、控制网络参数等。

TCPListener结构体中的fd字段是netFD类型的,其定义如下:

type netFD struct {
   
	pfd poll.FD

	// immutable until Close
	family      int
	sotype      int
	isConnected bool // handshake completed or use of association with peer
	net         string
	laddr       Addr
	raddr       Addr
}

netFD结构体各字段说明:

  • pfd:用于与底层的操作系统文件描述符进行交互。
  • family:表示套接字的协议家族,比如IPv4或IPv6。
  • sotype:表示套接字的类型,比如TCP或UDP
  • isConnected:表示连接是否已完成握手或与对方建立关联。
  • net:表示网络协议,比如"tcp"或"udp"。
  • laddr:表示本地网络连接的地址。
  • raddr:表示远程网络连接的地址。

服务器监听示例

服务器监听示例如下:

package main

import (
	"fmt"
	"net"
)

func main() {
   
	// 服务器监听
	listen, err := net.Listen("tcp", "0.0.0.0:8081")
	if err != nil {
   
		fmt.Printf("listen error, err = %v\n", err)
		return
	}
	defer listen.Close()
	fmt.Println("listen success...")
}

说明一下:

  • 服务器在创建监听套接字时,将其绑定到0.0.0.0(通常表示为INADDR_ANY)地址,这样服务器就可以同时监听和接受来自不同网络接口的连接请求,而不需要为每个接口分别创建监听套接字。
  • 为了避免网络文件描述符资源泄露,在创建监听器后及时利用defer机制关闭监听器。监听器被关闭后会停止监听新的连接请求,并且任何被阻塞的Accept操作都会被解除阻塞并返回错误。

客户端连接服务器

客户端连接服务器

在Go的net包中,Dial函数用于客户端应用程序与远程服务器建立连接。该函数的函数原型如下:

func Dial(network, address string) (Conn, error)

参数说明:

  • network:用于指定网络协议,比如"tcp", "udp"等。
  • address:用于指定连接的目标地址。

返回值说明:

  • 第一个返回值:表示建立的网络连接。
  • 第二个返回值:如果建立网络连接过程中出错,将返回非nil的错误值。

通过Dial函数建立得到的连接Conn类型的,该类型是一个接口类型,其定义如下:

type Conn interface {
   
	// Read reads data from the connection.
	Read(b []byte) (n int</
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021dragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值