账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    请问在go中如何实现一边监听客户端连接,一边监听用户在终端输入的命令呢?
    63
    0
    go新手,现在利用 go 实现一个在终端聊天的程序,我想请问一下如何实现服务端一边在监听新的连接请求,一边可以和其中的一个客户端聊天呢?我现在写的监听客户端连接的程序会阻塞住,在终端输入内容没反应,一时间没了思路,望大神指点一二,谢谢!
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • `兲倀地疚╮ 普通会员 1楼

      在Go中,你可以使用goroutine(协程)来实现一边监听客户端连接,一边监听用户在终端输入的命令。以下是一个简单的示例:

      ```go package main

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

      func listenAndPrintCommand(clientConn net.Conn, command string) { defer clientConn.Close()

      go func() {
          defer clientConn.Close()
          defer fmt.Println("Client disconnected")
      
          var buffer bytes.Buffer
          for {
              if _, err := clientConn.Read(buffer); err != nil {
                  fmt.Println("Error reading from client:", err)
                  return
              }
      
              // Split command by whitespace
              cmd := strings.Fields(buffer.String())
      
              // Check if command is a command we want to listen for
              if strings.HasPrefix(cmd[0], "gopass") || strings.HasPrefix(cmd[0], "kubectl") {
                  fmt.Printf("Received command: %s\n", cmd[0])
                  // Send response to client
                  _, err := clientConn.Write([]byte("Received command: " + cmd[0] + "\n"))
                  if err != nil {
                      fmt.Println("Error sending response:", err)
                      return
                  }
                  fmt.Println("Command sent successfully")
                  return
              }
      
              // Sleep for a short period to allow other clients to connect
              time.Sleep(1 * time.Second)
          }
      }()
      
      fmt.Println("Listening for commands...")
      // Start the listener
      listener, err := net.Listen("tcp", ":8080")
      if err != nil {
          fmt.Println("Error listening:", err)
          return
      }
      
      fmt.Printf("Listening for commands on port %d\n", listener.Addr().Port)
      for {
          conn, err := listener.Accept()
          if err != nil {
              fmt.Println("Error accepting connection:", err)
              continue
          }
      
          go listenAndPrintCommand(conn, command)
      }
      

      } ```

      在这个示例中,我们首先定义了一个goroutine来监听客户端连接。当有新的连接时,我们创建一个新的goroutine来处理这个连接。这个goroutine首先读取客户端的输入,然后通过strings.Fields函数将命令分割成命令行的各个部分。然后,我们检查每个命令是否符合我们想要监听的命令类型。如果命令类型符合,我们就打印出这个命令,然后通过clientConn.Write函数发送一个响应给客户端。如果发送响应失败,我们就打印出错误信息,并返回。

      然后,我们启动了一个监听端口的goroutine,这个goroutine监听指定的端口(这里是8080)。当有新的连接时,这个goroutine会接受这个连接,并将其传递给listenAndPrintCommand函数处理。

      注意,这个示例只是一个基本的示例,实际使用中你可能需要处理更复杂的情况,例如处理命令行错误、处理进程间通信、处理网络连接断开等。此外,这个示例假设你的命令是作为HTTP请求发送到服务器端的,如果你的命令是作为HTTP POST请求发送的,你需要在服务器端添加相应的处理代码来解析命令并处理响应。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部