2010-09-18 70 views
2

我正在爲我的遊戲(用Flex編寫)的聊天/ IM系統工作,並希望將其連接到我的服務器(寫入C#)通過套接字。從Flex(XMLSocket)連接到.NET(套接字)的數據問題

因此,我已經成功地將它們連接在一起,使用Flex上的XMLSocket和服務器端的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); 
     } 
    } 

請幫幫忙! 謝謝,羅恩

回答

2

發現問題 - 我沒有在每次發送結束時發送\ 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);