Go语言之简单聊天室

chatroom_server.go

package main

import (
	"fmt"
	"net"
	"os"
	"strings"
)
var onlineConns=make(map[string]net.Conn)

var messageQueue =make(chan string,1000)
var quitChan chan bool
func CheckError(err error){
	if err!=nil{
		fmt.Println("error:",err.Error())
		//0成功
		os.Exit(1)
	}
}
func processInfo(conn net.Conn ){
	//规定最大输入汉字为1024
	buf:=make([]byte,1024)
	defer conn.Close()
	for{
		numOfBytes,err:=conn.Read(buf)
		if err!=nil{
			break
		}

		/*if numOfBytes!=0{
			remoteAddr:=conn.RemoteAddr()
			fmt.Println(remoteAddr)
			//因为buf是缓存的数据,所以可能会接收到垃圾数据
			//只接受当前输入的字符
			fmt.Printf("Has received message: %s\n",string(buf[0:numOfBytes]))
		}*/
		if numOfBytes!=0{
			message:=string(buf[0:numOfBytes])
			//打印服务器接收到的消息
			fmt.Printf("Received message content: %s\n",message)
			//把message写到messageQueue里
			messageQueue<-message
		}


	}
}
func ConsumeMessage(){
	for{
		select {

		case message:=<-messageQueue:
			//对消息进行解析
			doProcessMessage(message)
			case <-quitChan:{
				break
			}

		}
	}
}
func doProcessMessage(message string){
	contents:=strings.Split(message,"#")
	if len(contents)>1{
		addr:=contents[0]
		sendMessage:=contents[1]
		fmt.Println(addr,sendMessage)
		addr=strings.Trim(addr," ")
		if conn,ok:=onlineConns[addr];ok{
			_,err:=conn.Write([]byte(sendMessage))
			if err!=nil{
				fmt.Println("online send failure")
			}else{
				//fmt.Println("size:",size)

			}
		}else{
			//fmt.Println("11")
		}

	}


}
func main(){

	listen_scoket,err:=net.Listen("tcp","127.0.0.1:8080")
	CheckError(err)
	defer listen_scoket.Close()
	fmt.Println("Server is waiting....")
	go ConsumeMessage()
	for{
		conn,err:=listen_scoket.Accept()
		CheckError(err)
		//把conn存储到onlineConns映射表里
		addr1:=fmt.Sprintf("%s",conn.RemoteAddr())
		onlineConns[addr1]=conn
		for addr:=range  onlineConns{
			fmt.Println(addr)
		}
		//通过协程处理连接
		go processInfo(conn)

	}
}

chatroom_client.go

package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
)

func checkError(err error){
	if err!=nil{
		fmt.Println("error:",err.Error())
		//0成功
		os.Exit(1)
	}
}
func MessageSend(conn net.Conn){
	var input string
	for{
		//fmt.Println("Please input your message(Enter键发送):")
		reader:=bufio.NewReader(os.Stdin)
		data,_,_:=reader.ReadLine()
		input=string(data)
		if strings.ToUpper(input)=="EXIT"{
			conn.Close()
			break
		}else{
			_,err:=conn.Write([]byte(input))
			if err!=nil{
				conn.Close()
				fmt.Println("client connect failure:",err.Error())

				break
			}else{
				fmt.Println("发送成功!")
			}

		}
		//fmt.Println(data)
	}

}
func main(){
	conn,err:=net.Dial("tcp","127.0.0.1:8080")
	checkError(err)
	defer conn.Close()
	go MessageSend(conn)
	buf:=make([]byte,1024)
	for{
		_,err:=conn.Read(buf)
		checkError(err)
		//打印收到的消息
		fmt.Println("server received message content:",string(buf))
	}
	fmt.Println("The client program end!")

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值