AS3 - Flash - /AIR-Socket-Kommunikation writeUTFBytes funktioniert nur einmal
Habe ich einen socket-server lauscht auf 2 ports, 1 port für die socket-server und 1 port für den policy server.
Mein code ist unten, in diesem Szenario werden Daten gesendet und empfangen werden, völlig in Ordnung. jedoch, wenn ich beispielsweise eine Schaltfläche hinzufügen mit einem einfachen:
socket.writeUTFBytes("Message");
socket.flush();
nach der ersten Verbindung, es scheint nicht zu senden keine Daten an meinen server (ich habe meinen server drucken alle übertragungen von Daten an die Konsole für die Prüfung) Erste-verbindungen funktionieren, wie unten gesehen:
//authenticate with socket server first:
var xmlSocket = new XMLSocket();
xmlSocket.connect("192.xx.xx.xx", 843);
try {
Security.loadPolicyFile("xmlsocket://192.xx.xx.xx:843");
} catch (e:IOError) {
//tbOutput.text += e.text;
}
var socket:Socket = new Socket();
socket.addEventListener(Event.CONNECT, onConnect);
socket.addEventListener(Event.CLOSE, onClose);
socket.addEventListener(IOErrorEvent.IO_ERROR, onError);
socket.addEventListener(ProgressEvent.SOCKET_DATA, onResponse);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecError);
try {
socket.connect("192.xx.xx.xx", 4444);
} catch (e:IOError) {
//error traced
}
function onConnect(e:Event):void {
//initial message to socket server:
var Message:String;
//message contains something
socket.writeUTFBytes(Message.toString() + "<EOF>");
socket.flush();
}
InformationsquelleAutor MWard | 2011-05-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du im Grunde haben Sie Recht, dass Sie gerade etwas verpasst.
Die erste Verbindung ist gespeichert für die crossdoamin Datei selbst wird Sie einen anderen port angeben, es wird versucht, die Datei von 4444 zuerst, und wenn das fehlschlägt, dann wird es gehen für den master am Standard-port(843).
Hier ist die betreffende Zeile
Wenn Sie sich Ihre server-logs, die Sie werden feststellen, dass, wenn die erste Verbindung hergestellt wurde gab es eine Anfrage in der form
<policy-file-request/>
zum server ist hergestellt.Sobald die Anforderung abgeschlossen ist und die Datei an den client ausgeliefert werden, dann wird die Verbindung vom client geschlossen immer.
Auf der client-Seite, sobald die crossdomain empfangen wird und die Verbindung geschlossen wird, können Sie dann wieder an und senden.
Also nochmals zur Wiederholung.
Ihre flash-app eine Verbindung zum server.
Dann wird Ihre app forderte die crossdomain und saß da und wartete
Bevor die Verbindung wegen Zeitüberschreitung abgebrochen Sie fuhr dann Fort, um Daten zu senden, von einer Art über Ihre Verbindung
Die app wartet nur noch auf die cross-domain erhielt eine Antwort von Ihrem server
Da die vom server empfangenen Daten nicht die crossdomain.xml Datei Ihrer app die Verbindung geschlossen, und wird nicht zulassen, verbindet
Änderte ich deinen code ein wenig zu auto reconnect
Allerdings ist Ihr server auf port 4444 zurückkehren sollte, die crossdomain-Datei, wenn es eine Anfrage für ihn.
Vergessen Sie nicht, für diese Arbeit den server auf port 4444 zurückgeben muss die crossdomain-Datei auf diesem port
Auf dem server im ReadCallBack Sie sind nicht in der Handhabung!bytesRead > 0) Dies ist, wo der client die Verbindung trennt. Versuchen Sie, einige debug-code, den Sie dort sehen werden, ist es ausgelöst wird.
ändern Sie "<EOF>" String.fromCharCode(0) der server wird zu Lesen, bis es sieht ein null-Zeichen oder bis Puffer voll ist. Also, wenn Sie vorbei an großen Mengen von Daten, die Sie haben, um die Schleife zu Lesen.
was sollte ich in der (!bytesRead > 0) - Bedingung? Ich im Grunde möchten, bereiten Sie den server für alle anderen ankommenden Daten?
Es ist nur ein test, um zu zeigen, dass seine Verbindung getrennt
InformationsquelleAutor The_asMan