<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 概述 ``` go build server.go ``` 1.監聽端口 : 9090 2.發送實例 ``` 加入會議 nick|123 聊天 say|123|hello,word|121 廣播 sayall|123|hello,word 退出 quit|123 ``` ## 文件 <details> <summary>server.go</summary> ``` package main import ( "fmt" "net" "strings" "github.com/lunny/log" ) type ConList struct { Con map[string]net.Conn Count int } func (c *ConList) Add(nickName string, Con net.Conn) { if nickName == "" { log.Error("昵稱為空") return } if Con == nil { log.Error("Con 為空") return } exit := c.IsExit(nickName) if exit { log.Error("存在 nickname :" + nickName) return } fmt.Println(Con.RemoteAddr(), "-->", nickName) //nick占在數組下標0上,客戶端上寫的昵稱占在數組下標1上 c.Con[nickName] = Con c.Count++ //發送通知給所有人入 c.sendAll(nickName + " --> join") fmt.Println("當前連接數 count", c.Count) } //判斷昵稱是否存在 func (c *ConList) IsExit(nickName string) bool { for k, _ := range c.Con { if k == nickName { return true } } return false } func (c *ConList) Remove(nickName string) { if nickName == "" { log.Error("nickName 為空") return } exit := c.IsExit(nickName) if !exit { log.Error("不存在 nickname :" + nickName) return } err := c.Con[nickName].Close() if err != nil { log.Error("刪除失敗") return } delete(c.Con, nickName) fmt.Println("刪除成功") c.Count-- fmt.Println("當前連接數 count", c.Count) } func (c *ConList) Send(nickName string, sendName string, msg string) { if nickName == "" { log.Error("nickname 為空") return } if sendName == "" { log.Error("sendName 為空") return } if msg == "" { log.Error("msg 參數為空") } exit1 := c.IsExit(nickName) if !exit1 { log.Error("nickname 不存在" + nickName) return } exit2 := c.IsExit(nickName) if !exit2 { log.Error("sendName 不存在" + sendName) return } _, err := c.Con[sendName].Write([]byte(msg)) if err != nil { log.Error("發送失敗", err) } fmt.Println("發送成功") } func (c *ConList) sendAll(s string) { for _, v := range c.Con { v.Write([]byte(s)) } } var ( ConnMap = ConList{Con: make(map[string]net.Conn), Count: 0} //聲明一個集合 ) func main() { listen_socket, err := net.Listen("tcp", ":9090") //打開監聽接口 if err != nil { fmt.Println("server start error") } defer listen_socket.Close() fmt.Println("server is wating port:9090 ....") for { conn, err := listen_socket.Accept() //收到來自客戶端發來的消息 if err != nil { fmt.Println("conn fail ...") } fmt.Println(conn.RemoteAddr(), "connect successed") go handle(conn) //創建線程 } } func handle(conn net.Conn) { for { data := make([]byte, 255) //創建字節流 (此處同 一對一 通信) num, err := conn.Read(data) //聲明并將從客戶端讀取的消息賦給msg_read 和err if num == 0 || err != nil { continue } //解析協議 msg_str := strings.Split(string(data[0:num]), "|") //將從客戶端收到的字節流分段保存到msg_str這個數組中 switch msg_str[0] { case "nick": //加入聊天室 nick|121 ConnMap.Add(msg_str[1], conn) case "say": //轉發消息 say|121|hello,word|121 ConnMap.Send(msg_str[1], msg_str[3], msg_str[2]) case "quit": //退出 quit|123 ConnMap.Remove(msg_str[1]) } } } ``` </details> <br/> <details> <summary> client.go</summary> ``` package main import ( "fmt" "log" "net" "os" ) func main() { Start(os.Args[1]) } func Start(tcpAddrStr string) { tcpAddr, err := net.ResolveTCPAddr("tcp4", tcpAddrStr) if err != nil { log.Printf("Resolve tcp addr failed: %v\n", err) return } // 向服務器撥號 conn, err := net.DialTCP("tcp", nil, tcpAddr) if err != nil { log.Printf("Dial to server failed: %v\n", err) return } // 向服務器發消息 go SendMsg(conn) // 接收來自服務器端的廣播消息 buf := make([]byte, 1024) for { length, err := conn.Read(buf) if err != nil { log.Printf("recv server msg failed: %v\n", err) conn.Close() os.Exit(0) break } fmt.Println(string(buf[0:length])) } } // 向服務器端發消息 func SendMsg(conn net.Conn) { username := conn.LocalAddr().String() for { var input string // 接收輸入消息,放到input變量中 fmt.Scanln(&input) if input == "/q" || input == "/quit" { fmt.Println("Byebye ...") conn.Close() os.Exit(0) } // 只處理有內容的消息 if len(input) > 0 { msg := username + " say:" + input _, err := conn.Write([]byte(msg)) if err != nil { conn.Close() break } } } } ``` </details> <br/>
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看