有关与 .Net 的 ActionScript 套接字通信的帮助

Posted

技术标签:

【中文标题】有关与 .Net 的 ActionScript 套接字通信的帮助【英文标题】:Help about ActionScript socket communication with .Net 【发布时间】:2011-03-16 14:16:21 【问题描述】:

我正在使用 ActionScript 连接到 C# 套接字服务器。 在客户端(ActionScript)中,我使用以下方式发送数据:

var socket:Socket = new Socket("localhost", 8080);
socket.writeUTF("hello");
socket.flush();

在服务器(C# 4.0)中,我使用这个:

server = new TcpListener(IPAddress.Any, 8080);
server.Start();
TcpClient client = server.AcceptTcpClient();
BinaryReader reader = new BinaryReader(client.GetStream(), Encoding.UTF8);
Console.WriteLine(reader.ReadString());

我可以将槽式闪存连接到服务器。但是服务器没有收到来自客户端的消息(“hello”)。服务器只是忽略消息,就像它没有发送一样。但是当我再次执行 reader.ReadString() 时,我会收到消息(因此我必须阅读两次才能获得每个输入)。

我想我知道问题所在 - 这是 Flash 写入字符串的方式: http://livedocs.adobe.com/flex/3/langref/flash/net/Socket.html#writeUTF()

这就是 C# 的读取方式: http://msdn.microsoft.com/en-us/library/system.io.binaryreader.read7bitencodedint.aspx

关于 C# 如何读取它的其他信息(查看备注):http://msdn.microsoft.com/en-us/library/system.io.binarywriter.write7bitencodedint.aspx

谁能告诉我如何使客户端和服务器都使用二进制数据进行通信? 谢谢,摩西。

【问题讨论】:

您是否错过了writeUTF()描述中的以下内容:“注意:此方法写入的数据不会立即传输;它会排队等待调用flush()方法。” ? 哦,在我的完整代码中,我使用了 'socket.flush()' 但我只是忘记在这里写了。因此,即使使用冲洗也无法正常工作。 【参考方案1】:

Hey Zippo 从闪存中写入一个字节将是:

socket.writeByte( byte )

这也是我为处理读取客户端数据而编写的一段服务器代码。

        NetworkStream clientStream = tcpListener.AcceptTcpClient().GetStream();

        byte[] message = new byte[4096];
        int bytesRead;

        while (true)
        
           bytesRead = 0;

           try
           
              //blocks until a client sends a message
              bytesRead = clientStream.Read(message, 0, 4096);
           
           catch
           
              //a socket error has occured
              break;
           

           if (bytesRead == 0)
           
              //the client has disconnected from the server
              break;
           

           //message has successfully been received
           ASCIIEncoding encoder = new ASCIIEncoding();
           String received = encoder.GetString(message, 0, bytesRead);

           for (int i = 0; i < bytesRead; i++)
           
              if (message[i] == MESSAGE_BEGIN)
              
                 player.currentMessage = new Message();
              
              else if (message[i] == MESSAGE_END)
              
                 _GotMessage(player, player.currentMessage);
              
              else if (message[i] == TYPE_BEGIN)
              
                 player.currentString = "";
              
              else if (message[i] == TYPE_END)
              
                 player.currentMessage.Type = player.currentString;
              
              else if (message[i] == STRING_PARAM_BEGIN)
              
                 player.currentString = "";
              
              else if (message[i] == STRING_PARAM_END)
              
                 int val;
                 bool isInt = Int32.TryParse(player.currentString, out val);
                 if (isInt)
                 
                    player.currentMessage.content.Add(val);
                 
                 else
                 
                    player.currentMessage.content.Add(player.currentString);
                 
              
              else
              
                 player.currentString += System.Convert.ToChar(message[i]);
              
           
        

为了完整起见,我包含了所有代码,但如果您有任何问题,请随时提问。服务器在 C# 中

【讨论】:

以上是关于有关与 .Net 的 ActionScript 套接字通信的帮助的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript:fscommand 与 ExternalInterface

actionscript-跟踪动作以获取FLV视频中有关提示点的信息

actionscript3-跟踪操作以获取有关FLV视频中提示点的信息

增加和减少点唱机的音量(Actionscript 3)

程序员应该如何开始使用Flash / Flex / ActionScript?

在舞台上有多个玩家 actionscript 3.0 php MySQL