天天看点

网络编程--Socket编程(TCP)

什么是Socket

    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等等。

TCP的C/S架构 

网络编程--Socket编程(TCP)

 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]))

}
           

执行结果:

网络编程--Socket编程(TCP)

此时服务器在等待客户端的连接。我们编写一个客户端。代码如下:

    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给服务器。然后服务器把这个数据原封不动的再回给客户端。

网络编程--Socket编程(TCP)

客户端和服务器完成一次数据通信,断开连接。