標籤:go golang go語言
代碼不做注釋了,因為我是把這個當作筆記來做的,如果感興趣Go語言,加我QQ 我們一起學習這門新興的語言.
服務端:Message_server.go
package mainimport ("container/list""encoding/json""fmt"Json "go-json" //go-simplejson"net""sync""time")type Client_message struct {sender intreceiver intmethod stringbody string}type All_message struct {List *list.ListLock sync.Mutex}type Message struct {Time int64Sender intMes string}var Ip_port string = ":5555"var Message_map map[int]All_message = make(map[int]All_message)func main() {Con, _ := net.Listen("tcp", Ip_port)defer Con.Close()for {con, _ := Con.Accept()fmt.Println(time.Now().Local(), ":", con.RemoteAddr())go Connection(con)}}func Connection(con net.Conn) {defer con.Close()for {Buf := make([]byte, 2048)n, e := con.Read(Buf)if e != nil {break}if n == 0 {continue}Mes, err := Json.NewJson(Buf[:n])if err != nil {con.Write([]byte("Not_Ok"))continue} else {con.Write([]byte("Ok"))}c_message := Convert_json(Mes)switch {case c_message.method == "put":Put_message(c_message)case c_message.method == "get":Buf := make([]byte, 2048)list := Get_message(c_message.receiver)if list == nil {con.Write([]byte("0"))continue}Num := len(list)con.Write([]byte(fmt.Sprint(Num)))n, e := con.Read(Buf)checkError("get", e)if string(Buf[:n]) == "Get_len_ok" {for _, v := range list {n, e := con.Write(v)n, e = con.Read(Buf)checkError("get_for", e)if string(Buf[:n]) == "Get_ok" {continue} else {break}}}}}}func Put_message(C_message Client_message) {var String Message = Message{time.Now().Unix(), C_message.sender, C_message.body}if Message_map[C_message.receiver].List == nil {Message_map[C_message.receiver] = All_message{List: list.New()}}M := Message_map[C_message.receiver]M.Lock.Lock()M.List.PushFront(String)M.Lock.Unlock()}func Get_message(Num int) [][]byte {var message_list [][]byteif Message_map[Num].List == nil {return nil}L := Message_map[Num]L.Lock.Lock()x := L.List.Len()for i := 0; i < x; i++ {Date, _ := json.Marshal(L.List.Remove(L.List.Back()))message_list = append(message_list, Date)}L.Lock.Unlock()return message_list}func checkError(pos string, e error) {if e != nil {fmt.Println(pos, " : ", e)}}func Convert_json(Mes *Json.Json) Client_message {var m Client_messagemethod, _ := Mes.Get("method").String()sender, _ := Mes.Get("sender").Int()receiver, _ := Mes.Get("receiver").Int()body, _ := Mes.Get("body").String()m = Client_message{sender, receiver, method, body}return m}用戶端:send_message.go
用戶端我分為兩個小部分,一個是專門自動接收的,一個是用的發訊息的,我想兩者同事進行,但不在GUI下面輸入輸出我不知道怎麼解決,所以就搞成兩部分.
package mainimport (//"encoding/json""fmt"json "go-json""net""strconv"t "time")type Client_message struct {sender intreceiver intmethod stringbody string}type Message struct {Time int64Sender intMes string}var sender int = 123456789var receiver int = 1597805565 //QQfunc main() {con, err := net.Dial("tcp", "127.0.0.1:5555")defer con.Close()if err != nil {fmt.Println(err)}/* 這個登出部分是用來發送訊息的,編譯的時候要登出掉這面一個for迴圈.for {var Str stringfmt.Scan(&Str)if x := Send_message(con, Str); string(x) == "Ok" {fmt.Println("訊息發送成功")}}*/for { //這個for迴圈是用來接收訊息的,不能和上面一個編譯在一起.if e := Get_message(con); e != nil {break}t.Sleep(3e9)}}func Send_message(con net.Conn, Str string) []byte {mes := []byte(fmt.Sprintf(`{"sender":%d,"receiver":%d,"method":"%s","body":"%s"}`, sender, receiver, "put", Str))if 0 < len(mes) && len(mes) <= 2048 {Buf := make([]byte, 2048)con.Write(mes)n, _ := con.Read(Buf)return Buf[:n]} else {fmt.Println("不可為空或者發送文本超過限制")return nil}}func Get_message(con net.Conn) error {var Buf []byte = make([]byte, 2048)mes := []byte(fmt.Sprintf(`{"sender":%d,"receiver":%d,"method":"%s","body":"%s"}`, sender, receiver, "get", ""))_, e := con.Write(mes)if e != nil {fmt.Println("訊息擷取失敗")return e}s := string(checkResponse(con))if s == "Ok" {Num, _ := strconv.Atoi(string(checkResponse(con)))if Num > 0 {con.Write([]byte("Get_len_ok"))for i := 0; i < Num; i++ {n, _ := con.Read(Buf)Result, _ := json.NewJson(Buf[:n])sender, _ := Result.Get("Sender").Int()time, _ := Result.Get("Time").Int64()body, _ := Result.Get("Mes").String()fmt.Println("發送人:", sender)fmt.Println("發送時間:", t.Unix(time, 0).Format("2006-01-02 03:04:05 PM"), "內容:", body)con.Write([]byte("Get_ok"))}}}return nil}func checkResponse(con net.Conn) []byte {Buf := make([]byte, 1024)n, e := con.Read(Buf)if e != nil {fmt.Println(e)}return Buf[:n]}
用戶端:
服務端:
Go語言實現定向聊天,最簡單的.