AS3 сокет / сервер MMO связь - PullRequest
       3

AS3 сокет / сервер MMO связь

1 голос
/ 28 ноября 2010

Я работаю над флэш-MMO с сервером ac #.У меня есть простой протокол обмена сообщениями для сокетов.Когда клиент присоединяется, он отправляет это:

 "%|clientId|need"

И позиции обновляются следующим образом:

 "$|clientId|xPosition|yPosition"

По некоторым причинам это не работает.Я храню все аватары в массиве, класс аватаров просто расширяет мувиклип.Это должно добавить всех клиентов в комнату, но это не работает.Любые идеи?

Редактировать: ошибка, вероятно, в коде на стороне клиента выше, я думаю, это с тем, как я храню аватары в массиве.

Вот мой код:

id.text = String(Math.random());
import flash.net.Socket;
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.utils.Dictionary;

var avatars:Array = new Array();

 var _socket:Socket = new Socket();
 _socket.addEventListener(ProgressEvent.SOCKET_DATA,socketData);
 _socket.addEventListener(Event.CONNECT,socketConnected);
 _socket.addEventListener(IOErrorEvent.IO_ERROR,socketError);



_socket.connect("192.168.1.4",8000);

function sendText(msg:String):void {
 if (_socket.connected) {
  _socket.writeUTFBytes(msg);
  _socket.flush();

 } else {

 }
}

function socketConnected(e:Event):void {
 chat.appendText("Connected. \n");
 sendText("%|" + id.text + "|need");
 //chat.scrollV = chat.maxScrollV;
}

function socketError(e:IOErrorEvent):void {
 chat.appendText("SYSTEM MSG:"+e.text+"\n");
 //chat.scrollV = chat.maxScrollV;
}

function socketData(e:ProgressEvent):void {
 var str:String = e.currentTarget.readUTFBytes(e.currentTarget.bytesAvailable);
 trace(str);
 //var xml:XML = new XML(str);
 chat.appendText(str + "\n");
 //[pos]|50|334
 if(str.search("$")){
  var positionArray = str.split("|");
  avatars[str[1]].x = str[2];
  avatars[str[1]].x = str[3];
 }
 if(str.search("%")){
  var miniArray = str.split("|");
  avatars[miniArray[1]] = new Avatar();
  addChild(avatars[miniArray[1]]);
  dump.text = miniArray[1];
 }

}



me.addEventListener(MouseEvent.MOUSE_DOWN, drag);
me.addEventListener(MouseEvent.MOUSE_UP, sDrag);

var timing:Boolean = false;
var t:Timer = new Timer(1);
t.addEventListener(TimerEvent.TIMER, tick);

function tick(e:TimerEvent){
 if(timing){
  sendText('$|'+id.text+'|'+me.x+'|'+me.y);
 }
 else{
 }
}

t.start();


function drag(e:MouseEvent){
 me.startDrag();
 timing = true;
}

function sDrag(e:MouseEvent){
 me.stopDrag();
 timing = false;
}

Ответы [ 2 ]

1 голос
/ 28 ноября 2010

Редактировать: Изменение ответа на основе дополнительной информации.

У вас было несколько проблем после обращения к коду. Сначала вы использовали if (str.search) ... $ и% можно анализировать как регулярное выражение. Кроме того, так как ваши символы были с индексом 0, эти if могут не соответствовать действительности. Наконец, вы использовали str [1] вместо positionArray [1] и т. Д. Ниже приведен рабочий код с некоторым взломом для тестирования без использования сервера сокетов. Могу показать вам некоторые приемы о том, как провести целенаправленное тестирование, когда вы столкнетесь с такими проблемами.

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;

    public class TestSocket extends Sprite
    {
        import flash.events.MouseEvent;
        import flash.events.TimerEvent;
        import flash.net.Socket;
        import flash.utils.Dictionary;
        import flash.utils.Timer;

        [Embed(source="assets/avatar.png")]
        private var Avatar:Class;

        private var avatars:Array = new Array();

        function TestSocket():void
        {
            socketSimulator(10);
        }


        function socketData(e:ProgressEvent):void {
            var str:String = e.currentTarget.readUTFBytes(e.currentTarget.bytesAvailable);
            trace(str);

            if(str.indexOf("$") >= 0){
                var positionArray = str.split("|");
                avatars[positionArray[1]].x = positionArray[2];
                avatars[positionArray[1]].x = positionArray[3];
            }
            if(str.indexOf("%") >= 0){
                var miniArray = str.split("|");
                avatars[miniArray[1]] = new Avatar();
                addChild(avatars[miniArray[1]]);
            }

        }


        /** Test Code **/
        private var _numClients;

        private function socketSimulator(numClients:int):void
        {
            _numClients = numClients; 

            var msg:String;

            while(--numClients >= 0)
            {
                msg = "%|" + numClients + "|need";
                sendFakeData(msg);
            }

            var timer:Timer = new Timer(500, 9999);
            timer.addEventListener(TimerEvent.TIMER, sendFakeMovement);
            timer.start();
        }

        private function sendFakeMovement(e:TimerEvent):void
        {
            var id:uint = Math.random() * _numClients;
            var x:Number = Math.random() * 1000;
            var y:Number = Math.random() * 1000;
            var msg:String = "$|"+id+"|"+x+"|"+y;

            sendFakeData(msg);
        }

        //This is just hacked test code, don't do this in production
        private function sendFakeData(msg:String):void
        {
            var e:MyProgressEvent = new MyProgressEvent(ProgressEvent.SOCKET_DATA);
            e.currentTarget = {
                readUTFBytes: function(bytes:int = 0):String
                {
                    return msg;
                }
            }

            socketData(e);
        }
    }
}
import flash.events.ProgressEvent;

class MyProgressEvent extends ProgressEvent
{
    private var _currentTarget:Object;

    public function set currentTarget(val:Object):void
    {
        _currentTarget = val;
    }

    override public function get currentTarget():Object
    {
        return _currentTarget;
    }

    function MyProgressEvent(type:String):void
    {
        super(type);
    }
}
0 голосов
/ 28 ноября 2010

Прежде чем тестировать вход / выход из системы / положение, убедитесь, что ваша архитектура в первую очередь поддерживает отправку и получение данных, я имею в виду, отправьте строку («некоторые данные») на внешний интерфейс и проверьте,Реально получаю ("некоторые данные") на бэкэнд.Я боюсь, что байтовая последовательность, которую вы отправляете на клиенте, отличается от таковой на сервере, и поэтому сервер будет неправильно понимать поступающие данные.Если это так, вам нужно преобразовать входящие сообщения в подходящий порядковый номер, прежде чем пытаться их обработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...