```go
listener, err := net.Listen("tcp", "127.0.0.1:7777")
checkError(err)
fmt.Println("建立成功!")
ch := make(chan string)
for {
//等待客户端接入
conn, err := listener.Accept()
....
```
我想在客户端建立连接的时候,把用户作为key,conn作为value,存在数据库或者redis里面,当想往某个用户发数据的时候,直接用户用户找到该用户的conn,如何实现呢
问题还是有点意思的,可以考虑用 chan 来实现这个,下面是我写的代码,可以参考着写个更完善的。
``` go
package main
import (
"bufio"
"fmt"
"io"
"net"
"os"
)
func main() {
l, _ := net.Listen("tcp", ":8000")
for {
conn, _ := l.Accept()
ch := make(chan string)
go talk(conn, ch)
go input(ch)
}
}
func talk(conn io.ReadWriteCloser, ch chan string) {
for c := range ch {
fmt.Fprintf(conn, c)
}
fmt.Fprintf(conn, "closed, byebye.")
conn.Close()
}
func input(ch chan string) {
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
for text != "#\n" {
ch <- text
text, _ = reader.ReadString('\n')
}
close(ch)
}
```
#2
更多评论
为什么要存数据库或者redis?
用户的连接是实时的,一旦断开就失效了,下次连接就是新的,你就存在内存的一个map里就可以。
存数据库或者redis的话,只可能存 conn 的内存地址,或者更底层的 socket fd, 但不管是哪个,在用户断开连接之后都会失效。
使用失效的内存地址作为指针获取conn会导致野指针访问,使用失效的 socket fd 如果这个fd号没被重用还好,被重用了你就把消息发给错误的人了
#3