开发者

golang套接字的实现

开发者 https://www.devze.com 2024-10-30 10:56 出处:网络 作者: get200
目录1. 基本概念2. TCP 套接字示例服务器端代码客户端代码3. UDP 套接字示例服务器端代码客户端代码4. 运行示例总结在 Go 语言中,使用标准库 net 来实现套接字编程。以下是有关 Go 套接字的基本概念和示例
目录
  • 1. 基本概念
  • 2. TCP 套接字示例
    • 服务器端代码
    • 客户端代码
  • 3. UDP 套接字示例
    • 服务器端代码
    • 客户端代码
  • 4. 运行示例
    • 总结

      在 Go 语言中,使用标准库 net 来实现套接字编程。以下是有关 Go 套接字的基本概念和示例。

      1. 基本概念

      • 网络类型
        • TCP:流套接字,提供可靠的、面向连接的通信。
        • UDP:数据报套接字,无连接,适用于快速传输。

      2. TCP 套接字示例

      服务器端代码

      package main
      
      import (
          "fmt"
          "net"
      )
      
      func main() {
          // 创建 TCP 套接字
          listener, err := net.Listen("tcp", ":12345")
          if err != nil {
              fmt.Println("Error starting server:", err)
              return
          }
          defer listener.Close()
      
          fmtphp.Println("Waiting for a connection...")
          for {
              // 接受连接
              conn, err := listener.Accept()
              if err != nil {
                  fmt.Println("Error accepting connection:", err)
                  continue
              }
              fmt.Println("Connection established from", conn.RemoteAddr())
      
              // 处理连接
              go handleConnection(conn)
          }
      }
      
      func handleConnection(conn net.Conn) {
          defer conn.Close()
          message := "Hello, Client!"
          conn.Write([]byte(message))
          fmt.Println("Message sent to client:", message)
      }
      

      客户端代码

      package main
      
      import (
          "fmt"
          "net"
      )
      
      func main() {
          // 连接到服务器
          conn, err := net.Dial("tcp", "localhost:12345")
          if err != nil {
       编程客栈       fmt.Println("Error connecting to server:", err)
              return
          }
          defer conn.Close()
      
          // 接收数据
          buffer := make([]byte, 1024)
          n, err := conn.Read(buffer)
          if err != nil {
              fmt.Println("Error reading from server:", err)
              return
          }
      
          fmt.Println("Received message from server:", string(buffer[:n]))
      }
      

      3. UDP 套接字示例

      服务器端代码

      package main
      
      import (
          "fmt"
          "net"
      )
      
      func main() {
          // 创建 UDP 套接字
          address, err := net.ResolveUDPAddr("udp", ":12345")
          if err != nil {
              fmt.Println("Error resolving address:", err)
              return
          }
      
          conn,js err := net.ListenUDP("udp", address)
          if err != nil {
              fmt.Println("Error listening:", err)
              return
          }
          defer conn.Close()
      
          fmt.Println("Waiting for a connection...")
          for {
              buffer := make([]byte, 1024)
              n, addr, err := conn.ReadFromUDP(buffer)
              if err != nil {
                  fmt.Println("Error reading from UDP:", err)
                  continue
              }
              fmt.Println("Received message from", addr, ":", string(buffer[:n]))
      
              // 发送响应
              response := []byte("Hello, UDP Client!")
              conn.WriteToUDP(response, addr)
          }
      }
      

      客户端代码

      package main
      
      import (
          "fmt"
          "net"
      )
      
      func main() {
          // 发送 UDP 数据包
          address, err := net.ResolveUDPAddr("udp", "localhost编程客栈:12345")
          if err != nil {
              fmt.Println("Error resolving address:", err)
              return
          }
      
          conn, err := net.DialUDP("udp", nil, address)
          if err != nil {
              fmt.Println("Error connecting:", err)
              return
          }
          defer conn.Close()
      
          message := []byte("Hello, Server!")
          conn.Write(message)
      
          // 接收响应
          buffer := make([]byte, 1024)
          n, _, err := conn.ReadFromUDP(buffer)
          if err != nil {
              fmt.Println("Error reading from server:", err)
              return
         编程客栈 }
      
          fmt.Println("Received message from server:", string(buffer[:n]))
      }
      

      4. 运行示例

      • 首先在一个终端中运行服务器代码。
      • 然后在另一个终端中运行客户端代码。

      总结

      Go 语言的 net 包使得套接字编程变得简单而高效。通过使用 TCP 或 UDP 套接字,你可以轻松实现网络通信。

      到此这篇关于golang套接字的实现的文章就介绍到这了,更多相关golang套接字内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号