- 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请求发送的,你需要在服务器端添加相应的处理代码来解析命令并处理响应。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

