go server

原创 2016年06月01日 23:40:42

package main

import (
 "database/sql"
 "fmt"
 _ "github.com/go-sql-driver/mysql"
 "net"
 "strings"
)

var maps map[string]net.Conn = make(map[string]net.Conn)

func find(findId string) string {
 db, err := sql.Open("mysql", "root:123@/liaotian?charset=utf8")
 check(err)

 rows, err := db.Query("SELECT * FROM user")
 check(err)

 defer rows.Close()
 for rows.Next() {

  var id int
  var name string
  var pwd string

  err := rows.Scan(&id, &name, &pwd)
  check(err)

  str := fmt.Sprintf("%d", id)

  if strings.EqualFold(str, findId) {
   return "success"
  }
 }
 return "fail"
}

func login(userId, upwd string) string {
 db, err := sql.Open("mysql", "root:123@/liaotian?charset=utf8")
 check(err)

 rows, err := db.Query("SELECT * FROM user")
 check(err)

 defer rows.Close()

 for rows.Next() {

  var id int
  var name string
  var pwd string

  err := rows.Scan(&id, &name, &pwd)
  check(err)
       //将int转换成string
  str := fmt.Sprintf("%d", id)

  if strings.EqualFold(str, userId) && strings.EqualFold(pwd, upwd) {
   return "success"
  }
 }
 return "fail"
}

func regist(name, pwd string) int64 {
 db, err := sql.Open("mysql", "root:123@/liaotian?charset=utf8")
 check(err)

 stmt, err := db.Prepare(`INSERT user (username,password) values (?,?)`)
 check(err)

 defer stmt.Close()
 res, err := stmt.Exec(name, pwd)

 if err != nil {
  fmt.Println(err)
  return 0
 }

 cuid, err := res.LastInsertId()
 return cuid
}

func check(err error) {
 if err != nil {
  fmt.Println(err)
  return
 }
}

func writetext(conn net.Conn, con string) {

 j := "3-" + con + "\n"
 a := []byte(j)
 conn.Write(a)
}

func writefind(conn net.Conn, re, findId string) {

 j := "44-" + re + "-" + findId + "\n"
 a := []byte(j)
 conn.Write(a)
}

func writelogin(conn net.Conn, re, userId, pwd string) {

 j := "2-" + re + "-" + userId + "-" + pwd + "\n"
 a := []byte(j)
 conn.Write(a)
}

func writeregist(conn net.Conn, userId int64) {

 str := fmt.Sprintf("%d", userId)
 j := "1-" + str + "\n"
 a := []byte(j)
 conn.Write(a)
}

func read(conn net.Conn) string {

 var str string
 name := make([]byte, 512)
 size, err := conn.Read(name)
 str = string(name)
 fmt.Println(size)
 check(err)
 return str
}

func doServerStuff(conn net.Conn) {
 
 remote := conn.RemoteAddr().String()
 fmt.Println(remote, " connected!")

 for {

  var s []string

  var types string = read(conn)
  s = strings.Split(types, "-&*%$")

  var ty = s[0]

  switch {
  case strings.EqualFold(ty, "regist"):

   var name = s[1]
   var pwd = s[2]
   var userId int64 = regist(name, pwd)

   writeregist(conn, userId)

  case strings.EqualFold(ty, "login"):

   var id = s[1]
   var pwd = s[2]

   ret := login(id, pwd)
   writelogin(conn, ret, id, pwd)

   if strings.EqualFold(ret, "success") {
    maps[id] = conn
    fmt.Println(id)
   }

  case strings.EqualFold(ty, "find"):

   var finderid = s[1]
   ret := find(finderid)
   writefind(conn, ret, finderid)

  case strings.EqualFold(ty, "text"):

   var con = s[1]
   var finderid = s[2]
   fmt.Println(finderid)
   fconn := maps[finderid]
   writetext(fconn, con)

  case strings.EqualFold(ty, "uuid"):

   var uuid = s[1]
   maps[uuid] = conn

  case strings.EqualFold(ty, "exit"):

   var uuid = s[1]
   var uid = s[2]
   fmt.Println(uid)

   delete(maps, uuid)

   if !(strings.EqualFold(uid, "null")) {
    delete(maps, uid)
   }
   conn.Close()
   return
  default:
   fmt.Println("fali.....")
  }
 }
}

func main() {
 fmt.Println("Starting the server...")
 listener, err := net.Listen("tcp", ":8888")
 check(err)

 for {
  conn, err := listener.Accept()
  check(err)

  go doServerStuff(conn)
 }
}

相关文章推荐

Ubuntu 14.04 安装Git Server Gogs

Ubuntu 14.04 安装Go Git Server 项目源码地址: https://github.com/gogits/gogs 安装参考文档: 1. 安装mysql和gits...

我学xingo golang服务器之-xingo_demo server.go start

我学xingo golang服务器之-xingo_demo server.go start 上三节分别讲解学习了,xingo服务器和客户端的协议处理,包括协议的生成,协议的解析和发送,最后又学习了x...
  • atgczcl
  • atgczcl
  • 2017年07月14日 17:46
  • 388

用Go写一个简单的TCP server or client 模型

对Conn封装的基本思路go内置了net包已经很好的封装了socket通讯。然而在实际使用中,由于net/Conn的Read/Write方法是堵塞的原因,必须将其放入单独的goroutine中进行处理...
  • sryan
  • sryan
  • 2016年07月14日 16:52
  • 4331

Go语言Http Server源码阅读

转自:http://www.cnblogs.com/yjf512/archive/2012/08/22/2650873.html 这篇文章出现的理由是业务上需要创建一个Web Server。创建...

websocket server base on go language

之前使用pusher.com提供的商业服务器,但在我的站速度慢,消息传递有丢失情况,所以自行构架 主要实现通知功能: 1. 根据每个page的 session_id来区分连接,数组方式存放,应对当...
  • ranhuan
  • ranhuan
  • 2012年09月23日 11:15
  • 539

SQL Server中的GO详解

下面的两组SQLServer语句使用go和不使用go好像没有区别。    (一)    create   table   aa(col1   int,col2   char(10))    go...

go http server读书笔记

go http server读书笔记 package main import ( "fmt" "net/http" "time" ) type customHandler ...

快速搭建HTTP服务器 go http server

go http server 例子,自定义路由。 package main import ( "fmt" "net/http" "reflect" "strings"...

Go net/PRC源码阅读server.go

Server端本篇文章主要是在Go net/rpc 的server.go包进行翻译,并添加注释之后会对client以及server进行总结,废话不多说 直接贴代码了。有不正确的地方还请多多指正。pac...
  • Paddy90
  • Paddy90
  • 2017年07月02日 16:25
  • 183
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:go server
举报原因:
原因补充:

(最多只允许输入30个字)