golang實現聊天室(五)
完成服務端廣播消息
server
package mainimport ("fmt""log""math/rand""net"
)type Client_list struct {list map[net.Conn]string
}func main() {client_list := Client_list{make(map[net.Conn]string, 0)}var conn, err = net.Listen("tcp","127.0.0.1:6888")if err != nil {return}for {c, err := conn.Accept()if err != nil {return}go client_list.Receive(c)}
}//noinspection GoUnresolvedReference
func (client_list *Client_list) Receive(c net.Conn) {for {reveive_byte := make([]byte, 256)lens, err := c.Read(reveive_byte)if err != nil {log.Fatal("Receive error")}reveive_byte = reveive_byte[:lens]fmt.Printf("%s\n", reveive_byte)client_list.BroadMessage(c)}
}func (client_list *Client_list) BroadMessage(c net.Conn) {// 用戶信息唯一表,唯一標識碼user := rand.Int() % 2client_list.list[c] = string(user)// 遍歷map表for clientKey, _ := range client_list.list{if clientKey == c {continue}var _, err = clientKey.Write([]byte("服務器廣播消息"))if err != nil {log.Fatal("Wrong about abroad message")}}}
client1
package mainimport ("fmt""log""net""time"
)func main() {var conn, err = net.DialTimeout("tcp", "127.0.0.1:6888", 30*time.Second)if err != nil {log.Fatal("conn error")}for {conn.Write([]byte("user 2\n "))time.Sleep(5 * time.Second)re_message := make([]byte, 255)length, err := conn.Read(re_message)if err != nil {return}re_message = re_message[:length]fmt.Printf("%s\n", re_message)}conn.Close()
}
client2
package mainimport ("fmt""log""net""time"
)func main() {var conn, err = net.DialTimeout("tcp", "127.0.0.1:6888", 30*time.Second)if err != nil {log.Fatal("conn error")}for {conn.Write([]byte("user 2\n "))time.Sleep(5 * time.Second)re_message := make([]byte, 255)length, err := conn.Read(re_message)if err != nil {return}re_message = re_message[:length]fmt.Printf("%s\n", re_message)}conn.Close()
}
小結
- 完成了服務端客戶端通信的基本模型
- 客戶端建立連接,服務端存儲客戶端基本信息
- 服務端根據map信息廣播消息
下期目標
- 指定用戶名作為唯一信息map
- 從命令行接收發送信息
- 服務端廣播唯一客戶端發送的信息,給除這個客戶端以外的客戶端信息
- 當客戶端退出時,服務端監測,并從map刪除,廣播消息給其他客戶端
- 客戶端可使用加密算法,對發送信息加密再發送