go语言学习笔记28------Goland之TCP、UDP通信①

1网络应用程序设计模式

1.1C/S模式

传统的网络应用设计模式,客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。

1.2B/S模式

浏览器(Browser)/服务器(Server)模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。

1.3优缺点

对于C/S模式来说,其优点明显。客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而提高数据传输效率。且,一般来说客户端和服务器程序由一个开发团队创作,所以他们之间所采用的协议相对灵活。可以在标准协议的基础上根据需求裁剪及定制。例如,腾讯所采用的通信协议,即为ftp协议的修改剪裁版。

C/S模式的缺点也较突出。由于客户端和服务器都需要有一个开发团队来完成开发。工作量将成倍提升,开发周期较长。另外,从用户角度出发,需要将客户端安插至用户主机上,对用户主机的安全性构成威胁。这也是很多用户不愿使用C/S模式应用程序的重要原因。

B/S模式的缺点也较明显。由于使用第三方浏览器,因此网络应用支持受限。另外,没有客户端放到对方主机上,缓存数据不尽如人意,从而传输数据量受到限制。应用的观感大打折扣。第三,必须与浏览器一样,采用标准http协议进行通信,协议选择不灵活。

因此在开发过程中,模式的选择由上述各自的特点决定。根据实际需求选择应用程序设计模式。

2简单的TCP C/S模型通信

这里写图片描述

2.1Server端:

Listen函数:

func Listen(network, address string) (Listener, error)
    network:选用的协议:TCP、UDP,  如:“tcp”或 “udp” 注意:只支持小写字母
    address:IP地址+端口号,           如:“127.0.0.1:8000”或 “:8000”

Listener 接口:

type Listener interface {
        Accept() (Conn, error)
        Close() error
        Addr() Addr
}

Conn 接口:

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
}

参看 https://studygolang.com/pkgdoc 中文帮助文档中的demo:

3 Goland之TCP服务器

示例代码:

package main

import (
   "net"
   "fmt"
)

func main() {
  listen,err:=net.Listen("tcp","127.0.0.1")
   if err!=nil{
       fmt.Println("listen err",err)
       return 
   }
   conn,err:=listen.Accept()
   if err!=nil{
       fmt.Println("listen err",err)
       return 
   }
   buf:=make([]byte,4096)
   n,err:=conn.Read(buf)
   if err!=nil{
       fmt.Println("read err",err)
       return 
   }
   fmt.Println("收到客户端发来的数据",string(buf[n]))
}

如图,在整个通信过程中,服务器端有两个socket参与进来,但用于通信的只有 conn 这个socket。它是由 listener创建的。隶属于服务器端。
这里写图片描述

2.2Client 端:

Dial函数:

     func Dial(network, address string) (Conn, error)
    network:选用的协议:TCP、UDP,如:“tcp”或 “udp”
    address:服务器IP地址+端口号, 如:“121.36.108.11:8000”或 “www.itcast.cn:8000”

Conn 接口:

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
}
package main

import (
   "net"
   "fmt"
)

func main() {
  conn,err:=net.Dial("tcp","127.0.0.1")
  if err!=nil{
   fmt.Println("dial err",err)
   return
  }
  defer conn.Close()

  _,err=conn.Write([]byte("客户端发出的信息"))
  if err!=nil{
   fmt.Println("write err",err)
   return 
  }
}

3简单的UDP C/S模型通信

3.1Server端:

由于UDP是“无连接”的,所以,服务器端不需要额外创建监听套接字,只需要指定好IP和port,然后监听该地址,等待客户端与之建立连接,即可通信。

创建监听地址:

func ResolveUDPAddr(network, address string) (*UDPAddr, error) 

创建用户通信的socket:

func ListenUDP(network string, laddr *UDPAddr) (*UDPConn, error) 

接收udp数据:

func (c *UDPConn) ReadFromUDP(b []byte) (int, *UDPAddr, error)

写出数据到udp:

func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error)

服务端完整代码实现如下:

package main

import (
   "net"
   "fmt"
)

func main() {
   addr, err := net.ResolveUDPAddr("udp", "127.0.0.1")
   if err != nil {
      fmt.Println("resolveaddr err", err)
      return
   }
   conn,err:=net.ListenUDP("udp",addr)
   if err!=nil{
      fmt.Println("listen udp err",err)
      return 
   }
   buf:=make([]byte,4096)
   n,addr,err:=conn.ReadFromUDP(buf)
   fmt.Println("从客户端中读取",string(buf[:n]))
}

3.2Client 端:

udp客户端的编写与TCP客户端的编写,基本上是一样的,只是将协议换成udp。注意只能使用小写。
代码如下:

package main

import (
   "net"
   "fmt"
)

func main() {
  conn,err:=net.Dial("udp","127.0.0.1")
  if err!=nil{
   fmt.Println("dial err",err)
   return
  }
  defer conn.Close()

  _,err=conn.Write([]byte("客户端发出的信息"))
  if err!=nil{
   fmt.Println("write err",err)
   return 
  }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值