Проблема с подключением данных из Flex (XMLSocket) в .NET (Socket) - PullRequest
2 голосов
/ 18 сентября 2010

Я работаю в системе чата / чата для своей игры (написанной на Flex) и хотел подключить ее к моему серверу (написанному на C #) через сокеты.

Итак, я успешно соединил их вместе, используя XMLSocket на Flex и Socket на стороне сервера, клиент получает событие подключения, правильно отправляет данные, но когда я пытаюсь отправить данные с сервера на клиент, ничего не происходит (хотя обратный вызов BeginSend показывает, что весь буфер был отправлен).

Клиент:

private var hostName:String = "localhost";
    private var port:uint = 4444;
    private var socket:XMLSocket;
    public var app:DotNETServerTest; 

    public function DotNetSocketExample() {
        socket = new XMLSocket();
        configureListeners(socket);
        socket.connect(hostName, port);
    }

    public function send(data:Object):void {
        socket.send(data);
    }

    public function disconnect():void {
        socket.close();
        closeHandler(null);
    }      

    private function configureListeners(dispatcher:IEventDispatcher):void {
        dispatcher.addEventListener(Event.CLOSE, closeHandler);
        dispatcher.addEventListener(Event.CONNECT, connectHandler);
        dispatcher.addEventListener(DataEvent.DATA, dataHandler);
    }

    private function closeHandler(event:Event):void {
        trace("closeHandler: " + event);
        app.send_btn.enabled = false;
        app.disconnect_btn.enabled = false;
    }

    private function connectHandler(event:Event):void {
        trace("connectHandler: " + event);
        app.send_btn.enabled = true;
        app.disconnect_btn.enabled = true;
    }

    private function dataHandler(event:DataEvent):void {
        trace("dataHandler: " + event);
        Alert.show(event.data);
    }

Сервер (только определенные части):

// This is the call back function, which will be invoked when a client is connected
    public static void OnClientConnect(IAsyncResult asyn)
    {
        try
        {
            SocketClient NewConnection = new SocketClient(SocketServer.EndAccept(asyn));

            // This is a test message I'm attempting to send
            SendMessageTo(NewConnection, "<test></test>");
            Clients.Add(NewConnection);
            WaitForData(NewConnection);
            LogMessage(NewConnection, "Client # {0} connected", Clients.Count);

            SocketServer.BeginAccept(new AsyncCallback(OnClientConnect), null);
        }
        catch (ObjectDisposedException)
        {
            LogMessage("OnClientConnection: Socket has been closed.");
        }
        catch (SocketException se)
        {
            Console.WriteLine(se.Message);
        }
    }

    internal static void SendMessageTo(SocketClient client, string Data)
    {
        byte[] byteData = Encoding.ASCII.GetBytes(Data);
        SendMessageTo(client, byteData);
    }

    internal static void SendMessageTo(SocketClient client, byte[] byteData)
    {
        try
        {
            client.socket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(SendCallback), client);
        }
        catch (Exception e)
        {
            LogMessage(client, "Error sending data to client: {0}", e.Message);
        }
    }

    internal static void SendCallback(IAsyncResult ar)
    {
        // Retrieve the socket from the async state object.
        SocketClient handler = (SocketClient)ar.AsyncState;
        try
        {
            int bytesSent = handler.socket.EndSend(ar);
        }
        catch (Exception e)
        {
            LogMessage(handler, e.Message);
        }
    }

Пожалуйста, помогите! Спасибо, Рон

1 Ответ

2 голосов
/ 19 сентября 2010

Обнаружена проблема - я не отправлял \ 0 в конце каждой отправки.

Изменено это:

byte[] byteData = Encoding.ASCII.GetBytes(Data);
client.socket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(SendCallback), client);

На это:

byte[] byteData = Encoding.ASCII.GetBytes(Data + "\0");
client.socket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(SendCallback), client);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...