赞
踩
网络编程有两种:
TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是 Internet 最基本的协议、Internet 国际互联网络的基础,简单地说,就是由网络层的 IP 协议和传输层的 TCP 协议组成的。
QQ间相互通讯案例:
每个 internet 上的主机和路由器都有一个 ip 地址,它包括网络号和主机号,ip 地址有 ipv4(32位)或者 ipv6(128 位). 可以通过 ipconfig 来查看
我们这里所指的端口不是指物理意义上的端口,而是特指 TCP/IP 协议中的端口,是逻辑意义上的端口。
如果把 IP 地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个 IP 地址的端口 可以有 65536(即:256×256)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从 0 到 65535(256×256-1)
端口分类:
注意事项:
使用go做socket网络开发使用的是 net 包
import "net"
net包提供了可移植的网络I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket。
虽然本包提供了对网络原语的访问,大部分使用者只需要Dial、Listen和Accept函数提供的基本接口;以及相关的Conn和Listener接口。crypto/tls包提供了相同的接口和类似的Dial和Listen函数。
官方示例:
Dial函数和服务端建立连接:
conn, err := net.Dial("tcp", "google.com:80")
if err != nil {
// handle error
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
// ...
Listen函数创建的服务端:
ln, err := net.Listen("tcp", ":8080")
if err != nil {
// handle error
}
for {
conn, err := ln.Accept()
if err != nil {
// handle error
continue
}
go handleConnection(conn)
}
type Dialer struct { // Timeout是dial操作等待连接建立的最大时长,默认值代表没有超时。 // 如果Deadline字段也被设置了,dial操作也可能更早失败。 // 不管有没有设置超时,操作系统都可能强制执行它的超时设置。 // 例如,TCP(系统)超时一般在3分钟左右。 Timeout time.Duration // Deadline是一个具体的时间点期限,超过该期限后,dial操作就会失败。 // 如果Timeout字段也被设置了,dial操作也可能更早失败。 // 零值表示没有期限,即遵守操作系统的超时设置。 Deadline time.Time // LocalAddr是dial一个地址时使用的本地地址。 // 该地址必须是与dial的网络相容的类型。 // 如果为nil,将会自动选择一个本地地址。 LocalAddr Addr // DualStack允许单次dial操作在网络类型为"tcp", // 且目的地是一个主机名的DNS记录具有多个地址时, // 尝试建立多个IPv4和IPv6连接,并返回第一个建立的连接。 DualStack bool // KeepAlive指定一个活动的网络连接的生命周期;如果为0,会禁止keep-alive。 // 不支持keep-alive的网络连接会忽略本字段。 KeepAlive time.Duration }
Dialer类型包含与某个地址建立连接时的参数。
每一个字段的零值都等价于没有该字段。因此调用Dialer零值的Dial方法等价于调用Dial函数。
*func (Dialer) Dial
func (d *Dialer) Dial(network, address string) (Conn, error)
Dial在指定的网络上连接指定的地址。参见Dial函数获取网络和地址参数的描述。
type Listener interface {
// Addr返回该接口的网络地址
Addr() Addr
// Accept等待并返回下一个连接到该接口的连接
Accept() (c Conn, err error)
// Close关闭该接口,并使任何阻塞的Accept操作都会不再阻塞并返回错误。
Close() error
}
Listener是一个用于面向流的网络协议的公用的网络监听器接口。多个线程可能会同时调用一个Listener的方法。
func Listen
func Listen(net, laddr string) (Listener, error)
返回在一个本地网络地址laddr上监听的Listener。网络类型参数net必须是面向流的网络:
“tcp”、“tcp4”、“tcp6”、“unix"或"unixpacket”。参见Dial函数获取laddr的语法。
type Conn interface { // Read从连接中读取数据 // Read方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真 Read(b []byte) (n int, err error) // Write从连接中写入数据 // Write方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真 Write(b []byte) (n int, err error) // Close方法关闭该连接 // 并会导致任何阻塞中的Read或Write方法不再阻塞并返回错误 Close() error // 返回本地网络地址 LocalAddr() Addr // 返回远端网络地址 RemoteAddr() Addr // 设定该连接的读写deadline,等价于同时调用SetReadDeadline和SetWriteDeadline // deadline是一个绝对时间,超过该时间后I/O操作就会直接因超时失败返回而不会阻塞 // deadline对之后的所有I/O操作都起效,而不仅仅是下一次的读或写操作 // 参数t为零值表示不设置期限 SetDeadline(t time
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。