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)
}

}

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