Я пытаюсь подключить С# с сценарием действий, чтобы я попытался это сделать, и он работал, и он подключился, но когда я попытался отправить файл writeUTF, я отлаживал свой сценарий действия и консольное приложение сразу закрывалось, и ничего не отображалось на нем, а swf загружает и BAM закрывается в течение 1 секунды
Я закодировал консольное приложение и просто добавил 5 строк в основную пустоту
static void Main(string[] args)
{
TcpListener server = new TcpListener(IPAddress.Any, 3001);
server.Start();
TcpClient client = server.AcceptTcpClient();
BinaryReader reader = new BinaryReader(client.GetStream(), Encoding.UTF8);
Console.WriteLine(reader.ReadString());
}
И я также добавил этот скрипт действия в свой файл сценария действий fla file
var socket:Socket = new Socket("127.0.0.1", 3001);
socket.writeUTF("h");
socket.flush();
Когда я добавил вторую строку скрипта действия и последние 2 строки кода С#, он начал эту ошибку, где он сразу же закрылся. Прежде чем он начал это делать, я получил ошибку отладки, показанную ниже
Unable to read beyond the end of the stream
Ошибка возникает в строке, которую он пытается записать на консоль reader.ReadString(), но теперь он сразу закрывается.
Есть несколько проблем в игре как на стороне ActionScript, так и на стороне сервера С#.
Клиент ActionScript
На стороне ActionScript вы сразу же записываете в сокет перед его подключением. Вам нужно дождаться подключения сокета, прослушивая Event.CONNECT
.
Было бы также целесообразно прослушивать IOErrorEvent
и SecurityErrorEvent
для обработки ошибок и борьбы с нарушениями изолированной программной безопасности и междоменными политиками.
public var socket:Socket;
public function connect():void {
socket = new Socket("127.0.0.1", 3001);
socket.addEventListener(Event.CONNECT, connectHandler);
}
public function connectHandler(event:Event):void {
socket.writeUTF("h");
socket.flush();
socket.close();
}
Сервер С#
На стороне сервера С# двоичный считыватель использует Read7BitEncodedInt
для анализа длины строки. Это 32-разрядное сжатое целое целое формате несовместимо с методом writeUTF()
ActionScript, который использует 16-разрядное целое число для длины строки.
Например, перейдите к StreamReader, чтобы увидеть, как работает ваш код.
public static void Main (string[] args)
{
TcpListener server = new TcpListener (IPAddress.Any, 3001);
server.Start ();
TcpClient client = server.AcceptTcpClient ();
StreamReader reader = new StreamReader (client.GetStream (), Encoding.UTF8);
Console.WriteLine (reader.ReadLine ());
}
Вы можете расширить класс сокетов ActionScript для пользовательской writeUTF()
, которая writeInt()
будет writeInt()
а затем writeUTFBytes()
если вы хотите сохранить двоичные считыватели.