从Flex(XMLSocket)到.NET(Socket)连接的数据问题 [英] Data issue connecting from Flex (XMLSocket) to .NET (Socket)

查看:156
本文介绍了从Flex(XMLSocket)到.NET(Socket)连接的数据问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为我的游戏(用Flex编写的)开发一个聊天/即时通讯系统,并希望通过套接字将其连接到我的服务器(用C#编写)。



因此,我已经成功地将它们连接在一起使用Flex上的XMLSocket和服务器端的Socket,客户端获取连接的事件,正确地发送数据,但是当我尝试从服务器发回数据客户端没有任何反应(即使BeginSend回调显示整个缓冲区已经发送)。

客户端:

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

公共函数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);



$ b

服务器(仅限特定部分):

  //这是回调函数,将在客户端连接时调用
public static void OnClientConnect(IAsyncResult asyn)
{
try
{
SocketClient NewConnection = new SocketClient(SocketServer.EndAccept(asyn));

//这是我试图发送
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);



内部静态无效SendMessageTo(SocketClient客户端,字符串数据)
{
byte [] byteData = Encoding.ASCII.GetBytes );
SendMessageTo(client,byteData);


内部静态无效SendMessageTo(SocketClient客户端,字节[] byteData)
{
尝试
{
client.socket.BeginSend (byteData,0,byteData.Length,SocketFlags.None,新的AsyncCallback(SendCallback),客户端);
}
catch(Exception e)
{
LogMessage(客户端,发送数据到客户端时出错:{0},e.Message);



内部静态无效SendCallback(IAsyncResult ar)
{
//从异步状态对象中检索套接字。
SocketClient处理程序=(SocketClient)ar.AsyncState;
try
{
int bytesSent = handler.socket.EndSend(ar);

catch(Exception e)
{
LogMessage(handler,e.Message);


$ / code $ / pre
$ b $ p请帮忙!
谢谢,Ron

解决方案

发现问题 - 我没有发送\0在每个

改变了这个: .ASCII.GetBytes(数据);
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);


I'm working on a chat/IM system for my game (which is written in Flex) and wanted to connect it to my server (which is written in C#) via sockets.

So, I've successfully connected them together using XMLSocket on Flex, and Socket on the server side, the client gets a connected event, sends data correctly, but when I try to send back data from the server to the client, nothing happens (even though the BeginSend callback shows that the entire buffer was sent).

Client:

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);
    }

Server (Only specific parts):

// 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);
        }
    }

Please help! Thanks, Ron

解决方案

Found the problem - I didn't send out \0 at the end of each send.

Changed this:

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

To this:

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

这篇关于从Flex(XMLSocket)到.NET(Socket)连接的数据问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆