您现在的位置是:首页 > 学习笔记 > Go语言Go语言

Golang之网络编程

冰山2019-02-25【Go语言】人已围观

简介1.协议
1.1协议
1.2典型协议
2.层与协议
2.1分层方式
3.通信过程
4.Socket编程
5.网络应用程序设计模式
5.1模式介绍
5.2优缺点
6.TCP通信 C/S模型通信
7.UDP通信 C/S模型通信
8.TCP通信并发C/S模型通信
9.UDP通信并发C/S模型通信
10.UDP与TCP的差异


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

7.2UDP通信 Client 端


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

 

8.TCP通信并发C/S模型通信

 

8.1TCP通信 并发Server端


现在已经完成了客户端与服务端的通信,但是服务端只能接收一个用户发送过来的数据,怎样接收多个客户端发送过来的数据,实现一个高效的并发服务器呢?

Accept()函数的作用是等待客户端的链接,如果客户端没有链接,该方法会阻塞。如果有客户端链接,那么该方法返回一个Socket负责与客户端进行通信。所以,每来一个客户端,该方法就应该返回一个Socket与其通信,因此,可以使用一个死循环,将Accept()调用过程包裹起来。

需要注意的是,实现并发处理多个客户端数据的服务器,就需要针对每一个客户端连接,单独产生一个Socket,并创建一个单独的goroutine与之完成通信。
 
package main

import (
   "net"
   "fmt"
)

func Handle(conn net.Conn)  {
   buf:=make([]byte,4096)
   n,err:=conn.Read(buf)
   if err!=nil{
      fmt.Println("read err",err)
      return
   }
   messsage:=buf[:n]
   fmt.Println("%d服务器端发来信息%s",conn.RemoteAddr(),messsage)
}
func main() {
   listen, err := net.Listen("tcp", "127.0.0.1")
   if err != nil {
      fmt.Println("listen err", err)
      return
   }
   defer listen.Close()
   for {
      conn,err:=listen.Accept()
      if err!=nil{
         fmt.Println("accept err",err)
         return
      }
      go Handle(conn)
   }
}

8.2TCP通信 并发Client端


客户端不仅需要持续的向服务端发送数据,同时也要接收从服务端返回的数据,因此可将发送和接收放到不同的协程中。

主协程循环接收服务器回发的数据(该数据应已转换为大写),并打印至屏幕;子协程循环从键盘读取用户输入数据,写给服务器。读取键盘输入可使用 os.Stdin.Read(str)。定义切片str,将读到的数据保存至str中。
这样,客户端也实现了多任务。


package main

import (
   "net"
   "fmt"
   "os"
)

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

 5/7   首页 上一页 3 4 5 6 7 下一页 尾页

  • 微信扫一扫~
  • 支付宝扫一扫~

很赞哦! ()

上一篇:Go并发

下一篇:微服务(microservices)

相关文章

文章评论

本站推荐