刚刚上班,机子环境还没配好,无聊至极,看到之前的代码有个开房间功能很强大。想模仿一下,结果发现太难了,还是先写了一个简单的不能再简单的功能。
客户端:
// BroadMessageClient project main.go
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
socket, err := net.Dial("tcp", "localhost:8080")
if err != nil {
fmt.Println("net dial error: ", err)
return
}
defer socket.Close()
go talksend(socket)
for {
fmt.Println("input:")
buf := make([]byte, 128)
n, err1 := socket.Read(buf)
buf = buf[0:n]
if err1 != nil {
fmt.Println("socket read error: ", err1)
return
} else {
fmt.Println("Receive: ", string(buf))
}
}
}
func talksend(socket net.Conn) {
fmt.Println("talksend begin...")
for {
var buff string
tmp := bufio.NewReader(os.Stdin)
buff, _ = tmp.ReadString('\n')
buff = buff[0 : len(buff)-2]
_, err := socket.Write([]byte(buff))
if err != nil {
fmt.Println("send message error: ", err)
}
}
}
服务器:
// BroadMessageServer project main.go
package main
import (
"fmt"
"net"
)
//var map_player map[int]net.Conn = map[int]net.Conn{}
var chennel = make(chan Player, 32)
var chennelnum int = 0
type Room struct {
roll [3]net.Conn
}
type Player struct {
fd net.Conn
room *Room
}
func main() {
socket, err := net.Listen("tcp", "localhost:8080")
if err != nil {
fmt.Println("socket listen error: ", err)
return
}
defer socket.Close()
// map_num := 0
for {
conn, err1 := socket.Accept()
if err1 != nil {
fmt.Println("socket accept error: ", err1)
continue
}
defer conn.Close()
tmpplayer := Player{conn, nil}
chennel <- tmpplayer
chennelnum++
if chennelnum >= 3 {
//四个玩家加入房间
CreateRoom()
chennelnum -= 3
}
//map_player[map_num] = conn
//map_num++
fmt.Println("one client accept")
// go onefun(tmpplayer)
//go fun(conn)
}
}
func CreateRoom() {
fmt.Println("createroom")
room := Room{}
var chentmp = make(chan Player, 8)
for i := 0; i < 3; i++ {
conntmp := <-chennel
room.roll[i] = conntmp.fd
chentmp <- conntmp
}
for j := 0; j < 3; j++ {
tmp := <-chentmp
tmp.room = &room
fmt.Println("+++++", tmp.room)
go onefun(tmp)
}
}
func onefun(tmpplayer Player) {
for {
buf := make([]byte, 128)
n, err := tmpplayer.fd.Read(buf)
if err != nil {
fmt.Println("socket read error: ", err)
//从Room中取出
return
}
buf = buf[0:n]
for i := 0; i < 3; i++ {
fmt.Println("------", tmpplayer.room)
if tmpplayer.room.roll[i] == tmpplayer.fd {
continue
}
tmpplayer.room.roll[i].Write(buf)
}
}
}
目前,这个代码使用了go语言,写了最简单的开房间,不存在将玩家剔除以及房间管理的功能。只是放在容器里,等玩家数量足够时候,添加入房间之内。