Go-簡易聊天室

使用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
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章