main.go

package main

import (
“fmt”
“net”
“encoding/binary”
“encoding/json”
“errors”
“io”
“debug/dwarf”//没有引入message包
“time”
)

//func readPkg(conn net.Conn) (mes message.Message, err error) {
// buf := make([]byte, 8096)
// fmt.Println(“读取客户端发送的消息”)
// //conn.Read在conn没有被关闭的情况下,才会阻塞
// //如果客户端关闭了conn则,就不会阻塞
// n, err := conn.Read(buf[:4])
// if n != 4 || err != nil {
// fmt.Println(“conn.Read err=”, err)
// err = errors.New(“read pkg header error”)
// return
// }
// //根据buf[:4]转成一个uint32类型
// var pkgLen uint32
// pkgLen = binary.BigEndian.Uint32(buf[0:4])
//
// //根据pkglen读取消息内容
// n,err = conn.Read(buf[:pkgLen])
// if n != int(pkgLen) || err != nil {
// //err = errors.New(“read pkg body error”)
// //fmt.Println(“conn.Read fail err=”, err)
// return
// }
// //把pkgLen反序列化成->message.Message
// err = json.Unmarshal(buf[:pkgLen], &mes)
// if err != nil {
// fmt.Println(“json.Unmarsha err=”, err)
// return
// }
// return
//}
//func writePkg(conn net.Conn,data[]byte)(err error){
// //先发送一个长度给对方
// var pkgLen uint32
// pkgLen = uint32(len(data))
// var buf[4]byte
// binary.BigEndian.PutUint32(buf[0:4],pkgLen)
// //发送长度
// n,err:=conn.Write(buf[:4])
// if n!=4||err!=nil{
// fmt.Println(“conn.Write(bytes)fail”,err)
// return
// }
// //发送data本身
// n,err=conn.Write(data)
// if n !=int(pkgLen)||err!=nil {
// fmt.Println(“conn.Write(bytes)fail”, err)
// return
// }
// return
//
//}
////编写一个函数serverProcessLogin函数,专门处理登陆请求
//func serverProcessLogin(conn net.Conn,mes*message.Message)(err error){
// //核心代码
// //1.先从mes中取出mes.Data,并直接反序列化成LoginMes
// var loginMes Message.LoginMes
// json.Unmarshal([]byte(mes.data),&loginMes)
// if err!=nil{
// fmt.Println(“json.Unmarshal fail err=”,err)
// return
// }
// //1先声明一个resMes
// var resMes message.Message
// resMes.Type=message.LoginResType
// //2在声明一个LoginResMes,并完成赋值
// var loginResMes message.LoginResMesType
// //如果用户id=100,密码=123456,认为合法,否则不合法
// if loginMes.UserId100&&loginMes.UserPwd"123456"{
//
// //合法
// loginMes.Code=200
//
// }else{
// //不合法
// loginMes.Code=500//500状态码,表示该用户不存在
// loginResMes.Error=“该用户不存在,该注册再使用…”
//
// }
// //3将 loginResMes序列化
// data,err:=json.Marshal(loginResMes)
// if err!=nil{
// fmt.Println(“json.Marshal fail”,err)
// return
// }
// //4.将data赋值给resMes
// resMes.Data=string(data)
// //5.对resMes进行序列化,准备发送
// data,err=json.Marshal(resMes)
// if err!=nil{
// fmt.Println(“json.Marshal fail”,err)
// return
// }
// //6.发送data 我们将其封装到write
// err=writePkg(conn,data)
// return
//}
////编写一个ServerProcessMes函数
////功能:根据客户端发送消息种类不同,决定调用哪个函数来处理
//func (this *Processor)serverProcessMes(conn net.Conn,mes message.Message)(err error){
// switch mes.Type {
// case message.LoginMesType:
// //处理登陆
// err=serverProcessLogin(conn,mes)
// case message.RegisterMesType:
// //处理注册
// default:
// fmt.Println(“消息类型不存在,无法处理…”)
//
// }
// return
//}
//
////处理和客户端的通讯
//func process(conn net.Conn) {
// //这里需要延迟关闭conn
// defer conn.Close()
// //循环的读客户端发送的信息
// for {
// //这里我们将读取数据包,直接封装成一个函数readPkg(),返回Message,Err
// mes, err := readPkg(conn)
// if err != nil {
// if err == io.EOF {
// fmt.Println(“客户端退出,服务器端也正常退出…”)
// return
// } else {
// fmt.Println(“readPkg err=”, err)
// return
// }
// fmt.Println(“mes”, mes)
// }
// err=serverProcessLogin(conn,&mes)
// if err!=nil{
// return
// }
// }
//}
func process(conn net.Conn){
//这里需要延迟关闭conn
defer conn.Close()
//这里调用总控,创建一个
process:=&Processor{
Conn:conn,
}
err=Processor.process2()
if err!=nil{
fmt.Println(“客户端和服务器通讯协程错误=err”,err)
return
}
}
func init() {
//当服务器启动时,我们就去初始化我们的redis的连接池
initPool(“localhost:6379”,16,0,300
time.Second)
initUserDao()

}

//这里我们编写一个函数,完成对UserDao的初始化任务
func initUserDao(){
//这里的pool本身就是一个全局的变量
//这里需要注意一个初始化顺序问题
//initPool,在initUserDao
model.MyUserDao=model.NewUserDao(pool)
}
func main() {

//提示信息
fmt.Println("服务器[新的结构]在8889端口监听....")
listen, err := net.Listen("tcp", "0.0.0.0:8889")
defer listen.Close()
if err != nil {
	fmt.Println("net.Listen err=", err)
	return
}
//一旦监听成功,就等待客户端来链接服务器
for {
	fmt.Println("等待客户端来链接服务器....")
	conn, err := listen.Accept()
	if err != nil {
		fmt.Println("listen.Accept err=", err)
	}
	//一旦链接成功,则启动一个协程和客户端保持通讯。。
	go process(conn)
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章