使用go寫多人簡易聊天室
server.go
```bash
```bash
```go
package main
import (
"bufio"
"fmt"
"log"
"net"
//"os"
)
type Client struct {
Conn net.Conn
Name string
Addr string
}
var ClientMap map[string]Client = map[string]Client{}
func ToDo(conn net.Conn,msg string) {
if _,ok := ClientMap[conn.RemoteAddr().String()];!ok{
return
}
name := ClientMap[conn.RemoteAddr().String()].Name
for _,v := range ClientMap {
fmt.Fprintf(v.Conn,"%s : %s \n",name,msg)
fmt.Println(name,msg)
}
}
func Quit(conn net.Conn) {
//如果map裏面沒有連接信息說明已經關閉
if _,ok := ClientMap[conn.RemoteAddr().String()];!ok{
return
}
name := ClientMap[conn.RemoteAddr().String()].Name
for _,v := range ClientMap {
fmt.Fprintf(v.Conn,"%s is quit home \n",name)
}
delete(ClientMap,conn.RemoteAddr().String())
conn.Close()
}
func main() {
// 1. 監聽服務 Listen/ListenPacket
// 2. 接收客戶端連接 Accept
// 3. 處理客戶端連接(數據交換)
// 4. 關閉客戶端 defer
// 5. 關閉服務 defer
addr := "0.0.0.0:9999"
listener, err := net.Listen("tcp", addr)
if err != nil {
log.Fatal(err)
}
// 延遲關閉
defer listener.Close()
log.Printf("listen on: [%s]", addr)
// 循環接受
for {
// 接收客戶端連接
conn, err := listener.Accept()
if err != nil {
log.Println(err)
continue
}
reader := bufio.NewReader(conn)
line ,_,err := reader.ReadLine()
if err != nil {
fmt.Println(err)
return
}
if _,ok := ClientMap[ conn.RemoteAddr().String()] ;!ok {
ClientMap[conn.RemoteAddr().String()] = Client{
Conn: conn,
Name: string(line),
Addr: conn.RemoteAddr().String(),
}
}
fmt.Println(ClientMap)
go func(conn net.Conn) {
// 延遲關閉客戶端
defer conn.Close()
msg := "is add home "
ToDo(conn,msg)
//handleConnection(conn,20)
log.Printf("client[%s] is connected...", conn.RemoteAddr())
// 從客戶端讀取數據
reader := bufio.NewReader(conn)
//scanner := bufio.NewScanner(os.Stdin)
for {
//for _,client := range ClientMap {
line_two, _, err := reader.ReadLine()
if err != nil {
log.Println(err)
Quit(conn)
break
} else {
if string(line_two) == "quit" {
Quit(conn)
break
}
msgs := string(line_two)
ToDo(conn,msgs)
}
}
}(conn)
}
}
client.go
```go
package main
import (
"bufio"
"fmt"
"log"
"net"
"os"
)
func Read(conn net.Conn) {
for {
reader := bufio.NewReader(conn)
line, _, err := reader.ReadLine()
if err != nil {
fmt.Println(err)
conn.Close()
os.Exit(0)
}
fmt.Println(string(line))
}
}
func main() {
addr := "127.0.0.1:9999"
// 連接服務器
conn, err := net.Dial("tcp", addr)
if err != nil {
log.Fatal(err)
conn.Close()
return
}
defer conn.Close()
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("name is :")
scanner.Scan()
if scanner.Text() == "" {
fmt.Println("name is not nil")
return
}
fmt.Fprintf(conn,"%s\n",scanner.Text())
go Read(conn)
for {
scanner.Scan()
if scanner.Text() == "quit"{
fmt.Println("退出")
conn.Close()
return
}
if scanner.Text() == "" {
fmt.Println("輸入不爲空")
continue
}
_,err := fmt.Fprintf(conn,"%s\n",scanner.Text())
if err != nil {
fmt.Println("服務器已關閉")
conn.Close()
return
}
}
}