有关与 .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视频中提示点的信息