Socket,英文含义是插座、插孔。一般称之为套接字,用于描述IP地址和端口,可以实现不同程序间的数据通信。
Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口,这就是Socket编程接口。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。
Server端:
1. Listen函数:
func Listen(network,address string) (Listener,error)
network : 选用的协议 , 如:tcp 或 udp
address :服务器自己的IP地址+端口号, 如:127.0.0.1:8080
2. Listener接口:(socket)
type Listener interface{
Accept() (Conn,error)
Close() error
Addr() Addr
}
3.Conn接口:(socket)
type Conn interface{
Read(b []byte) (n int,err error)
Write(b []byte) (n int,err error)
Close() error
LocalAddr() Addr
RemoteAddr() Addr
}
例:
server端代码:
package main import ( "fmt" "net" ) func main() { //指定服务器通信协议、IP地址、Port端口,创建一个用于监听的socket---listener listener ,err := net.Listen("tcp","127.0.0.1:8000") if err != nil{ fmt.Println("net.Listener err:",err) return } defer listener.Close()//关闭socket fmt.Println("服务器等待客户端建立连接...") //阻塞监听客户端连接请求,成功建立连接,返回用于通信的socket---conn conn ,err := listener.Accept() if err != nil{ fmt.Println("listener.Accept err:",err) return } defer conn.Close()//关闭socket fmt.Println("服务器与客户端成功建立连接") //读取客户端发送的数据 buf := make([]byte,4096) n ,err := conn.Read(buf) if err != nil{ fmt.Println("conn.Read err:",err) return } //处理数据--打印 fmt.Println("",string(buf[:n])) }执行结果:
此时服务器在等待客户端的连接。我们编写一个客户端。代码如下:
client端:
package main import ( "fmt" "net" ) func main() { //指定服务器IP+port,创建通信socket--conn conn,err := net.Dial("tcp","127.0.0.1:8000") if err != err{ fmt.Println("net.Dial err:",err) return } defer conn.Close() //客户端主动写数据给服务器 conn.Write([]byte("hello everyone!")) //接受服务器回发的数据 buf:=make([]byte,4096) n ,err := conn.Read(buf) if err != err{ fmt.Println("conn.Read err:",err) return } fmt.Println("服务器回发的数据:",string(buf[:n])) }执行客户端后,客户端发送了hello everyone给服务器。然后服务器把这个数据原封不动的再回给客户端。
客户端和服务器完成一次数据通信,断开连接。