Помощь по взаимодействию сокетов ActionScript с .Net - PullRequest
3 голосов
/ 15 июля 2010

Я использую 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());

Я могу подключить через сервер флеш-память. Но сервер не получает сообщение («привет») от клиента. Сервер просто игнорирует сообщение, как будто оно не было отправлено. Но когда я снова выполняю 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

Кто-нибудь может мне сказать, как я могу заставить и клиента, и сервер общаться, используя двоичные данные?
Спасибо, Моше.

1 Ответ

0 голосов
/ 07 февраля 2011

Эй, 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 #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...