实现逻辑
1、Golang 版本 1.3
2、实现原理:
1、主进程建立TCP监听服务,并且初始化一个变量 talkChan := make(map[int]chan string)
2、当主进程ACCEPT连接请求后,利用go 启动一个协程A去维持和客户端的连接,把taokChan带入到协程里
3、和客户端建立连接的协程A,发送消息给客户端,使其发送自己的用户信息。
4、协程A在收到客户端发送的用户信息后,建立一个此用户对应的管道 talkChan[uid] = make(chan string)
5、协程A再启动一个协程A1去专门用来读取客户端发送的消息,并且用来判断是发送给谁的消息,然后把消息放到对应的chan里。
6、协程A再启动一个协程A2用来读取此用户对应的管道,如果里面有信息,则取出来发送到客户端。
实现代码
服务端测试代码:server.go
package main
import (
"fmt"
"log"
"net"
"strconv"
)
func handleConnection(conn net.Conn, talkChan map[int]chan string) {
//fmt.Printf("%pn", talkChan) //用以检查是否是传过来的指针
/*
定义当前用户的uid
*/
var curUid int
var err error
/*
定义关闭通道
*/
var closed = make(chan bool)
defer func() {
fmt.Println("defer do : conn closed")
conn.Close()
fmt.Printf("delete userid [%v] from talkChan", curUid)
delete(talkChan, curUid)
}()
/**
* 提示用户设置自己的uid, 如果没设置,则不朝下执行
*/
for {
//提示客户端设置用户id
_, err = conn.Write([]byte("请设置用户uid"))
if err != nil {
return
}
data := make([]byte, 1024)
c, err := conn.Read(data)
if err != nil {
//closed <- true //这样会阻塞 | 后面取closed的for循环,没有执行到。










