202 lines
3.4 KiB
Go
202 lines
3.4 KiB
Go
package lib
|
|
|
|
import (
|
|
"chat/message"
|
|
"chat/process"
|
|
"chat/user"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net"
|
|
)
|
|
|
|
type Server struct {
|
|
Id int
|
|
Users []user.User
|
|
Messages message.Message
|
|
}
|
|
|
|
const SavePath = "./data.json"
|
|
|
|
var Rchan = make(chan process.Ms, 100000)
|
|
|
|
func NewServer() *Server {
|
|
data, err := ioutil.ReadFile(SavePath)
|
|
if err == nil {
|
|
s := &Server{}
|
|
x := json.Unmarshal(data, s)
|
|
if x != nil {
|
|
return &Server{}
|
|
}
|
|
return s
|
|
}
|
|
return &Server{}
|
|
}
|
|
|
|
func (server *Server) Login(uid int, pw string) error {
|
|
for _, u := range server.Users {
|
|
if uid == u.Id && pw == u.Password {
|
|
return nil
|
|
}
|
|
}
|
|
return errors.New("not found this u")
|
|
}
|
|
|
|
func (server *Server) Store() {
|
|
data, err := json.Marshal(server)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
err = ioutil.WriteFile(SavePath, data, 0755)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
}
|
|
|
|
func (server *Server) AddUser(name, pw string, sex int8) {
|
|
server.Id++
|
|
u := user.User{
|
|
server.Id, name, sex, pw,
|
|
}
|
|
server.Users = append(server.Users, u)
|
|
}
|
|
|
|
func (server *Server) Process(conn net.Conn) {
|
|
m := make([]byte, 0)
|
|
read, err := conn.Read(m)
|
|
if err != nil {
|
|
return
|
|
}
|
|
fmt.Println(read)
|
|
}
|
|
|
|
func (server *Server) do(s *message.LoginS, conn net.Conn) (string, error) {
|
|
err := server.Login(s.Uid, s.Pw)
|
|
re := message.Message{
|
|
Type: "login_response",
|
|
Data: nil,
|
|
}
|
|
re.Data = message.Correspond{
|
|
Code: 1,
|
|
Msg: "success",
|
|
Error: "",
|
|
}
|
|
if err != nil {
|
|
re.Data = message.Correspond{
|
|
Code: 0,
|
|
Msg: "login fail",
|
|
Error: "pw fail or user not exist",
|
|
}
|
|
}
|
|
|
|
err = process.WriteConn(conn, re)
|
|
return "login_send", err
|
|
}
|
|
|
|
func (s *Server) processConn() {
|
|
for {
|
|
select {
|
|
case c := <-Rchan:
|
|
switch c.Msg.Type {
|
|
case "login_send":
|
|
l := c.Msg.Data.(*message.LoginS)
|
|
_, err := s.do(l, c.Conn)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (server *Server) read(conn net.Conn) {
|
|
defer func(conn net.Conn) {
|
|
err := conn.Close()
|
|
if err != nil {
|
|
fmt.Println(err, "ssssssssssssssss")
|
|
}
|
|
}(conn)
|
|
|
|
process.Read(conn, Rchan)
|
|
|
|
/*for {
|
|
var info = make([]byte, 65536)
|
|
i, err := conn.Read(info)
|
|
if err != nil {
|
|
fmt.Println(err, "errrrrrrrrrrrrr")
|
|
return
|
|
}
|
|
msg := message.Message{}
|
|
err = json.Unmarshal(info[:i], &msg)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
t := message.MsgType[msg.Type]
|
|
mm := message.Message{}
|
|
mm.Data = reflect.New(t).Interface()
|
|
err = json.Unmarshal(info[:i], &mm)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
switch msg.Type {
|
|
case "login_send":
|
|
if d,ok:=mm.Data.(*message.LoginS);ok{
|
|
_, err := server.do(d,conn)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/*switch reflect.TypeOf(mm.Data){
|
|
case reflect.TypeOf(&LoginS{}):
|
|
x :=mm.Data.(*LoginS)
|
|
e := s.Login(x.Uid,x.Pw)
|
|
re := Message{
|
|
Type: "login_response",
|
|
Data: nil,
|
|
}
|
|
if e != nil {
|
|
re.Data=Correspond{
|
|
Code: 0,
|
|
Msg: "login fail",
|
|
Error: "pw fail or user not exist",
|
|
}
|
|
}else{
|
|
re.Data=Correspond{
|
|
Code: 1,
|
|
Msg: "success",
|
|
Error: "",
|
|
}
|
|
}
|
|
m, _ :=json.Marshal(re)
|
|
_, err := conn.Write(m)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
}*/
|
|
|
|
}
|
|
|
|
func (server *Server) Start() {
|
|
listen, err := net.Listen("tcp", "0.0.0.0:8989")
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
go server.processConn()
|
|
for {
|
|
conn, err := listen.Accept()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
continue
|
|
}
|
|
go server.read(conn)
|
|
}
|
|
}
|