コード例 #1
0
ファイル: Peer.cs プロジェクト: andhikanugraha/tetembakan
        private Peer()
        {
            this.state = GameState.Connect;
            this.isCreator = false;
            this.peerInfo = new PeerInfo(IPAddress.Loopback.ToString(), -1);
            this.lastMessage = MessageType.Null;
            this.currentRoom = null;
            this.roomRequester = new Queue<PeerInfo>();
            this.lastMessageClient = MessageType.Null;
            this.keepAliveSender = new System.Timers.Timer(GameConstant.keepAliveInterval);
            this.keepAliveSender.Elapsed += new ElapsedEventHandler(sendKeepAlive);
            this.keepAliveSenderCreator = new System.Timers.Timer(GameConstant.keepAliveInterval);
            this.keepAliveSenderCreator.Elapsed += new ElapsedEventHandler(sendKeepAliveCreator);
            this.keepAliveResponse = new System.Timers.Timer(GameConstant.connectionTimeOut);
            this.keepAliveResponse.Elapsed += new ElapsedEventHandler(trackerDown);
            this.keepAliveResponseCreator = new System.Timers.Timer(GameConstant.connectionTimeOut);
            this.keepAliveResponseCreator.Elapsed += new ElapsedEventHandler(creatorDown);

            for (int i = 1; i <= 8; i++ )
            {
                cubenode[i] = new List<int>();
            }
            cubenode[1].Add(2); cubenode[1].Add(4); cubenode[1].Add(5); cubenode[1].Add(7);
            cubenode[2].Add(1); cubenode[2].Add(3); cubenode[2].Add(6); cubenode[2].Add(8);
            cubenode[3].Add(2); cubenode[3].Add(4); cubenode[3].Add(5); cubenode[3].Add(7);
            cubenode[4].Add(1); cubenode[4].Add(3); cubenode[4].Add(6); cubenode[4].Add(8);
            cubenode[5].Add(1); cubenode[5].Add(3); cubenode[5].Add(6); cubenode[5].Add(8);
            cubenode[6].Add(2); cubenode[6].Add(4); cubenode[6].Add(5); cubenode[6].Add(7);
            cubenode[7].Add(1); cubenode[7].Add(3); cubenode[7].Add(6); cubenode[7].Add(8);
            cubenode[8].Add(2); cubenode[8].Add(4); cubenode[8].Add(5); cubenode[8].Add(7);

            // there is a reason that takes long sentences to explain why I passed random object here
            // instead of creating new random object when needed.
        }
コード例 #2
0
ファイル: Room.cs プロジェクト: andhikanugraha/tetembakan
 public Room(PeerInfo creator, string roomID, int maxPlayer, List<PeerInfo> connectedPeers)
 {
     this.creator = creator;
     this.roomID = roomID;
     this.maxPlayer = maxPlayer;
     this.connectedPeers = connectedPeers;
 }
コード例 #3
0
ファイル: PeerInfo.cs プロジェクト: andhikanugraha/tetembakan
 public bool Equals(PeerInfo peer)
 {
     if ((this.peerID == peer.peerID) && (this.peerIP == peer.peerIP) && (this.port == peer.port))
     {
         return true;
     }
     return false;
 }
コード例 #4
0
ファイル: Room.cs プロジェクト: andhikanugraha/tetembakan
 public Room(PeerInfo creator, string roomID, int maxPlayer)
 {
     this.creator = creator;
     this.roomID = roomID;
     this.maxPlayer = maxPlayer;
     this.connectedPeers = new List<PeerInfo>(maxPlayer);
     addPlayer(creator);
 }
コード例 #5
0
ファイル: Room.cs プロジェクト: andhikanugraha/tetembakan
 // Copy constructor
 public Room(Room room)
 {
     this.creator = new PeerInfo(room.creator.getIP(), room.creator.getID(), room.creator.getPort(), room.creator.getUsername());
     this.roomID = room.roomID;
     this.maxPlayer = room.maxPlayer;
     this.connectedPeers = new List<PeerInfo>();
     foreach (PeerInfo peer in room.connectedPeers)
     {
         this.connectedPeers.Add(new PeerInfo(peer.getIP(), peer.getID(), peer.getPort(), peer.getUsername()));
     }
 }
コード例 #6
0
ファイル: Room.cs プロジェクト: andhikanugraha/tetembakan
 // Concstruct Room Object from ByteArray Data
 public Room(byte[] roomByte)
 {
     int offset = 0;
     int roomIDLength = BitConverter.ToInt32(roomByte, offset); offset += 4;
     this.roomID = Encoding.ASCII.GetString(roomByte, offset, roomIDLength); offset += roomIDLength;
     byte[] creator = new byte[GameConstant.peerInfoSize];
     Buffer.BlockCopy(roomByte, offset, creator, 0, GameConstant.peerInfoSize);
     this.creator = new PeerInfo(creator);
     offset += GameConstant.peerInfoSize;
     int maxPlayer = BitConverter.ToInt32(roomByte, offset); offset += GameConstant.maxPlayerSize;
     this.maxPlayer = maxPlayer;
     int connectedPeersCount = BitConverter.ToInt32(roomByte, offset); offset += 4;
     this.connectedPeers = new List<PeerInfo>(connectedPeersCount);
     for (int i = 0; i < connectedPeersCount; i++)
     {
         byte[] peer = new byte[GameConstant.peerInfoSize];
         Buffer.BlockCopy(roomByte, offset, peer, 0, GameConstant.peerInfoSize);
         offset += GameConstant.peerInfoSize;
         this.connectedPeers.Add(new PeerInfo(peer));
     }
 }
コード例 #7
0
ファイル: Peer.cs プロジェクト: andhikanugraha/tetembakan
        private void onReceiveTracker(IAsyncResult ar)
        {
            try
            {
                peerToTrackerSocket.EndReceive(ar);

                msgReceived = new Message(msgByte);
                msgResponse = new Message();
                byte[] message;
                switch (msgReceived.msgType)
                {
                    case MessageType.HandshakeResponse:
                        this.peerInfo = new PeerInfo(msgReceived.peer);
                        this.keepAliveSender.Start();
                        this.keepAliveResponse.Start();
                        gotoLobby();
                        break;

                    case MessageType.KeepAlive:
                        this.keepAliveResponse.Stop();
                        this.keepAliveResponse.Start();
                        break;

                    case MessageType.Room:
                        drawLobby(msgReceived.roomList);
                        this.state = GameState.Lobby;
                        break;

                    case MessageType.Success:
                        switch (lastMessage)
                        {
                            case MessageType.Create:
                                isCreator = true;
                                drawRoom();
                                this.state = GameState.Room;
                                break;

                            case MessageType.CreatorQuit:
                                gotoLobby();
                                break;
                        }
                        break;

                    case MessageType.Failed:
                        switch (lastMessage)
                        {
                            case MessageType.Create:
                                System.Console.WriteLine("Failed to create room");
                                System.Console.WriteLine("Maximum number of room has been reached or roomID already exists");
                                break;

                            case MessageType.Join:
                                System.Console.WriteLine("Failed to join room");
                                System.Console.WriteLine("Maximum number of player has been reached or room not found");
                                break;
                        }
                        break;

                    case MessageType.Check:
                        if (currentRoom.getConnectedPeers().Count < currentRoom.getMaxPlayer())
                        {
                            msgResponse = new Message(MessageType.CheckResponse, msgReceived.peerIDJoinRoom, true, this.peerInfo.getPort());
                        }
                        else
                        {
                            msgResponse = new Message(MessageType.CheckResponse, msgReceived.peerIDJoinRoom, false, this.peerInfo.getPort());
                        }
                        message = msgResponse.toByte();
                        peerToTrackerSocket.BeginSend(message, 0, message.Length, SocketFlags.None,
                                                        new AsyncCallback(onSendTracker), null);
                        break;

                    case MessageType.JoinSuccess:
                        connectToCreator(msgReceived.room.getCreator().getIP(), msgReceived.room.getCreator().getPort());
                        break;

                    case MessageType.CreatorQuit:
                        if (this.peerInfo.getID() == msgReceived.peer.getID())
                        {
                            this.currentRoom.setCreator(this.peerInfo);
                            this.currentRoom.getConnectedPeers().Clear();
                            this.currentRoom.getConnectedPeers().Add(this.peerInfo);
                            this.isCreator = true;
                            this.peerList = new List<PeerHandler>();
                            initializeP2PConnection();
                        }
                        else
                        {
                            this.currentRoom.setCreator(new PeerInfo(msgReceived.peer));
                            connectToCreator(msgReceived.peer.getIP(), msgReceived.peer.getPort());
                        }
                        return;
                }
                Array.Clear(msgByte, 0, msgByte.Length);
                peerToTrackerSocket.BeginReceive(msgByte, 0, msgByte.Length, SocketFlags.None,
                                                    new AsyncCallback(onReceiveTracker), null);
            }
            catch (Exception e)
            {
                Console.WriteLine("onReceiveTracker exception : {0}", e.Message);
                Console.WriteLine(e.Source);
                Console.WriteLine(e.InnerException);
                Console.WriteLine(e.StackTrace);
                Console.WriteLine(e.TargetSite);
            }
        }
コード例 #8
0
ファイル: Peer.cs プロジェクト: andhikanugraha/tetembakan
        private void onReceivePeerServer(IAsyncResult ar)
        {
            try
            {
                Socket peerSocket = (Socket)ar.AsyncState;
                peerSocket.EndReceive(ar);

                msgReceived = new Message(msgByteP2PServer);
                msgResponse = new Message();

                switch (msgReceived.msgType)
                {
                    case MessageType.HandshakeCreator:
                        PeerInfo newPlayer = new PeerInfo(msgReceived.peer);
                        this.peerList.Add(new PeerHandler(peerSocket, newPlayer, this));
                        this.currentRoom.addPlayer(newPlayer);

                        msgResponse = new Message(MessageType.RoomInfo, this.currentRoom);
                        break;

                    case MessageType.KeepAlive:
                        msgResponse = new Message(MessageType.KeepAlive, msgReceived.peerID);
                        PeerHandler handler = getHandler(msgReceived.peerID);
                        handler.isAlive = true;
                        handler.isAliveTimer.Stop();
                        handler.isAliveTimer.Start();
                        break;

                    case MessageType.GameUpdate:
                        msgResponse = new Message(MessageType.GameUpdate, msgReceived.timestamp, msgReceived.gameUpdate);
                        foreach (PeerInfo peer in this.currentRoom.getConnectedPeers())
                        {
                            if (cubenode[this.currentRoom.getIDOnRoom(this.peerInfo.getID())].Contains(this.currentRoom.getIDOnRoom(peer.getID())))
                                System.Console.WriteLine(peer.ToString() + " -> " + this.peerInfo.ToString() + " : " + msgReceived.timestamp + " " + msgReceived.gameUpdate.ToString());
                        }
                        addQueue(msgReceived);
                        break;

                    case MessageType.Quit:
                        msgResponse = new Message(MessageType.Success);
                        this.currentRoom.removePlayer(msgReceived.peerID);
                        removePeerHandler(msgReceived.peerID);
                        break;
                }

                byte[] message = msgResponse.toByte();
                peerSocket.BeginSend(message, 0, message.Length, SocketFlags.None,
                                        new AsyncCallback(onSendPeerServer), peerSocket);

                if (msgReceived.msgType != MessageType.Quit) {
                    peerSocket.BeginReceive(msgByteP2PServer, 0, msgByteP2PServer.Length, SocketFlags.None,
                                                new AsyncCallback(onReceivePeerServer), peerSocket);
                }

                if (msgReceived.msgType == MessageType.Quit || msgReceived.msgType == MessageType.HandshakeCreator)
                {
                    byte[] m = new Message(MessageType.RoomInfo, this.currentRoom).toByte();
                    foreach (PeerHandler peer in peerList)
                    {
                        if (peer.socket != peerSocket)
                        {
                            peer.socket.BeginSend(m, 0, m.Length, SocketFlags.None, new AsyncCallback(onSendPeerServer), peer.socket);
                        }
                    }

                    byte[] msgTracker = new Message(MessageType.RoomInfo, this.currentRoom).toByte();
                    peerToTrackerSocket.BeginSend(msgTracker, 0, msgTracker.Length, SocketFlags.None,
                                                    new AsyncCallback(onSendTracker), null);
                    drawRoom();
                }
                if (msgReceived.msgType == MessageType.GameUpdate)
                {
                    byte[] msg = new Message(MessageType.GameUpdate, msgReceived.timestamp, msgReceived.gameUpdate).toByte();
                    foreach (PeerHandler peer in peerList)
                    {
                        if (peer.socket != peerSocket)
                        {
                            peer.socket.BeginSend(msg, 0, msg.Length, SocketFlags.None, new AsyncCallback(onSendPeerServer), peer.socket);
                        }
                    }

                }
            }
            catch (Exception e)
            {
                Console.WriteLine("onReceivePeerServer exception : {0}", e.Message);
                Console.WriteLine(e.Source);
                Console.WriteLine(e.InnerException);
                Console.WriteLine(e.StackTrace);
                Console.WriteLine(e.TargetSite);
            }
        }
コード例 #9
0
ファイル: PeerInfo.cs プロジェクト: andhikanugraha/tetembakan
 public PeerInfo(PeerInfo peer)
 {
     this.peerIP = peer.peerIP; this.peerID = peer.peerID; this.port = peer.port; this.username = peer.username;
 }
コード例 #10
0
ファイル: Room.cs プロジェクト: andhikanugraha/tetembakan
 public void addPlayer(PeerInfo newPlayer)
 {
     connectedPeers.Add(newPlayer);
 }
コード例 #11
0
ファイル: Message.cs プロジェクト: andhikanugraha/tetembakan
        // Construct message object from ByteArray
        public Message(byte[] msg)
        {
            int offset = 0;
            string pstr = Encoding.ASCII.GetString(msg, offset, GameConstant.pstr.Length);
            offset += GameConstant.pstr.Length;

            if (pstr.Equals(GameConstant.pstr))
            {
                this.pstr = pstr;
                Buffer.BlockCopy(msg, offset, this.reservedByte, 0, 8);
                offset += reservedByte.Length;
                int messageCode = (int)msg[offset]; offset++;

                switch (messageCode)
                {
                    case GameConstant.handshakeCode:
                        this.msgType = MessageType.Handshake;
                        this.username = Encoding.ASCII.GetString(msg, offset, GameConstant.usernameSize).Trim();
                        break;

                    case GameConstant.handshakeResponseCode:
                        this.msgType = MessageType.HandshakeResponse;
                        byte[] peerHR = new byte[GameConstant.peerInfoSize];
                        Buffer.BlockCopy(msg, offset, peerHR, 0, GameConstant.peerInfoSize);
                        this.peer = new PeerInfo(peerHR);
                        //this.peerID = BitConverter.ToInt32(msg, offset); offset += 4;
                        //this.port = BitConverter.ToInt32(msg, offset);
                        break;

                    case GameConstant.keepAliveCode:
                        this.msgType = MessageType.KeepAlive;
                        this.peerID = BitConverter.ToInt32(msg, offset);
                        break;

                    case GameConstant.createCode:
                        this.msgType = MessageType.Create;
                        this.peerID = BitConverter.ToInt32(msg, offset); offset += GameConstant.peerIdSize;
                        this.maxPlayer = BitConverter.ToInt32(msg, offset); offset += GameConstant.maxPlayerSize;
                        this.roomID = Encoding.ASCII.GetString(msg, offset, GameConstant.roomIDSize);
                        this.roomID = this.roomID.Replace("\0", String.Empty).Trim();
                        break;

                    case GameConstant.listCode:
                        this.msgType = MessageType.List;
                        this.peerID = BitConverter.ToInt32(msg, offset);
                        break;

                    case GameConstant.roomCode:
                        this.msgType = MessageType.Room;
                        this.roomCount = BitConverter.ToInt32(msg, offset);
                        offset += GameConstant.roomCountSize;
                        for (int i = 0; i < this.roomCount; i++)
                        {
                            if ((int)msg[offset] == GameConstant.beginRoomCode)
                            {
                                offset++;
                                int beginRoom = offset;
                                int roomByteLength = 0;
                                while ((int)msg[offset] != GameConstant.endRoomCode)
                                {
                                    roomByteLength++;
                                    offset++;
                                }
                                offset++;

                                byte[] roomByte = new byte[roomByteLength];
                                Buffer.BlockCopy(msg, beginRoom, roomByte, 0, roomByteLength);
                                this.roomList.Add(new Room(roomByte));
                            }
                        }
                        break;

                    case GameConstant.successCode:
                        this.msgType = MessageType.Success;
                        break;

                    case GameConstant.failedCode:
                        this.msgType = MessageType.Failed;
                        break;

                    case GameConstant.joinCode:
                        this.msgType = MessageType.Join;
                        this.peerID = BitConverter.ToInt32(msg, offset);
                        offset += GameConstant.peerIdSize;
                        this.roomID = Encoding.ASCII.GetString(msg, offset, GameConstant.roomIDSize);
                        this.roomID = this.roomID.Replace("\0", String.Empty).Trim();
                        break;

                    case GameConstant.startCode:
                        this.msgType = MessageType.Start;
                        this.peerID = BitConverter.ToInt32(msg, offset);
                        offset += GameConstant.peerIdSize;
                        this.turn = BitConverter.ToInt32(msg, offset);
                        offset += 4;
                        this.roomID = Encoding.ASCII.GetString(msg, offset, GameConstant.startSize);
                        this.roomID = this.roomID.Replace("\0", String.Empty).Trim();
                        break;

                    case GameConstant.quitCode:
                        this.msgType = MessageType.Quit;
                        this.peerID = BitConverter.ToInt32(msg, offset);
                        break;

                    case GameConstant.checkCode:
                        this.msgType = MessageType.Check;
                        this.peerIDJoinRoom = BitConverter.ToInt32(msg, offset);
                        break;

                    case GameConstant.checkResponseCode:
                        this.msgType = MessageType.CheckResponse;
                        this.peerIDJoinRoom = BitConverter.ToInt32(msg, offset);
                        offset += GameConstant.peerIdSize;
                        this.isJoinAccepted = BitConverter.ToBoolean(msg, offset); offset += 1;
                        this.port = BitConverter.ToInt32(msg, offset);
                        break;

                    case GameConstant.handshakeCreatorCode:
                        this.msgType = MessageType.HandshakeCreator;
                        byte[] peer = new byte[GameConstant.peerInfoSize];
                        Buffer.BlockCopy(msg, offset, peer, 0, GameConstant.peerInfoSize);
                        this.peer = new PeerInfo(peer);
                        break;

                    case GameConstant.playerCode:
                        this.msgType = MessageType.Player;
                        int players = BitConverter.ToInt32(msg, offset); offset += 4;
                        for (int i = 0; i < players; i++)
                        {
                            byte[] peerByte = new byte[GameConstant.peerInfoSize];
                            Buffer.BlockCopy(msg, offset, peerByte, 0, GameConstant.peerInfoSize);
                            offset += GameConstant.peerInfoSize;

                            this.player.Add(new PeerInfo(peerByte));
                        }
                        break;

                    case GameConstant.joinSuccessCode:
                        this.msgType = MessageType.JoinSuccess;
                        if ((int)msg[offset] == GameConstant.beginRoomCode)
                        {
                            offset++;
                            int beginRoom = offset;
                            int roomByteLength = 0;
                            while ((int)msg[offset] != GameConstant.endRoomCode)
                            {
                                roomByteLength++; offset++;
                            }
                            offset++;

                            byte[] roomByte = new byte[roomByteLength];
                            Buffer.BlockCopy(msg, beginRoom, roomByte, 0, roomByteLength);

                            this.room = new Room(roomByte);
                        }
                        break;

                    case GameConstant.creatorQuitCode:
                        this.msgType = MessageType.CreatorQuit;
                        byte[] creatorPeer = new byte[GameConstant.peerInfoSize];
                        Buffer.BlockCopy(msg, offset, creatorPeer, 0, GameConstant.peerInfoSize);
                        this.peer = new PeerInfo(creatorPeer);
                        break;

                    case GameConstant.RoomInfoCode:
                        this.msgType = MessageType.RoomInfo;
                        if ((int)msg[offset] == GameConstant.beginRoomCode)
                        {
                            offset++;
                            int beginRoom = offset;
                            int roomByteLength = 0;
                            while ((int)msg[offset] != GameConstant.endRoomCode)
                            {
                                roomByteLength++; offset++;
                            }
                            offset++;

                            byte[] roomByte = new byte[roomByteLength];
                            Buffer.BlockCopy(msg, beginRoom, roomByte, 0, roomByteLength);

                            this.room = new Room(roomByte);
                        }
                        break;

                    case GameConstant.SelfPromoteCreatorCode:
                        this.msgType = MessageType.SelfPromoteCreator;
                        byte[] promote = new byte[GameConstant.peerInfoSize];
                        Buffer.BlockCopy(msg, offset, promote, 0, GameConstant.peerInfoSize);
                        offset += GameConstant.peerInfoSize;
                        this.peer = new PeerInfo(promote);
                        Buffer.BlockCopy(msg, offset, promote, 0, GameConstant.peerInfoSize);
                        this.peer2 = new PeerInfo(promote);
                        break;

                    case GameConstant.GameUpdate:
                        this.msgType = MessageType.GameUpdate;
                        this.timestamp = BitConverter.ToInt64(msg, offset);
                        offset += GameConstant.timestampSize;
                        byte[] gameUpdate = new byte[GameConstant.gameUpdateSize];
                        Buffer.BlockCopy(msg, offset, gameUpdate, 0, GameConstant.gameUpdateSize);
                        this.gameUpdate = new GameUpdate(gameUpdate);
                        break;

                }
            }
        }
コード例 #12
0
ファイル: Room.cs プロジェクト: andhikanugraha/tetembakan
 public void setCreator(PeerInfo creator)
 {
     this.creator = creator;
 }
コード例 #13
0
ファイル: Message.cs プロジェクト: andhikanugraha/tetembakan
        // Construct message for SelfPromoteCreator message
        private byte[] constructMessage(MessageType msgType, PeerInfo peer, PeerInfo peer2)
        {
            List<byte> msg = new List<byte>();
            msg.AddRange(GameConstant.pstrByte);
            msg.AddRange(GameConstant.reservedByte);
            msg.Add((byte)GameConstant.SelfPromoteCreatorCode);
            msg.AddRange(peer.toByte());
            msg.AddRange(peer2.toByte());

            return msg.ToArray();
        }
コード例 #14
0
ファイル: Message.cs プロジェクト: andhikanugraha/tetembakan
        // Construct message for HandshakeCreator, CreatorQuit message
        private byte[] constructMessage(MessageType msgType, PeerInfo peer)
        {
            byte code;
            switch (msgType)
            {
                case MessageType.HandshakeCreator:
                    code = (byte)GameConstant.handshakeCreatorCode; break;

                case MessageType.CreatorQuit:
                    code = (byte)GameConstant.creatorQuitCode; break;

                case MessageType.HandshakeResponse:
                    code = (byte)GameConstant.handshakeResponseCode; break;

                default:
                    return null;
            }
            List<byte> msg = new List<byte>();
            msg.AddRange(GameConstant.pstrByte);
            msg.AddRange(GameConstant.reservedByte);
            msg.Add(code);
            msg.AddRange(peer.toByte());

            return msg.ToArray();
        }
コード例 #15
0
ファイル: Peer.cs プロジェクト: andhikanugraha/tetembakan
 public PeerHandler(Socket socket, PeerInfo info, Peer peer)
 {
     this.peer = peer;
     this.socket = socket;
     this.info = info;
     this.isAlive = true;
     this.isAliveTimer = new System.Timers.Timer(GameConstant.connectionTimeOut);
     this.isAliveTimer.Elapsed += new ElapsedEventHandler(dead);
     this.isAliveTimer.Start();
 }
コード例 #16
0
ファイル: Peer.cs プロジェクト: andhikanugraha/tetembakan
 private void dead(object source, ElapsedEventArgs e)
 {
     peer.removeDeadPeer(this.info.getID());
     this.isAliveTimer.Stop();
     this.socket = null; this.info = null; this.isAliveTimer = null; this.peer = null;
 }
コード例 #17
0
ファイル: Message.cs プロジェクト: andhikanugraha/tetembakan
 // Constructor for SelfPromoteCreator message
 public Message(MessageType msgType, PeerInfo peer, PeerInfo peer2)
 {
     this.msgType = msgType; this.peer = peer; this.peer2 = peer2;
 }