سؤال

تحتاج لعبة Flash الخاصة بي إلى الاتصال بخادم مقبس PHP الخاص بي. بسبب أشياء أمان، يجب إرسال ملف سياسة إلى عميل Flash عندما يحاول الاتصال.

ما يلي هو ما قمت به.

في Actioncript / Flex 3 / Flash:

Security.loadPolicyFile("http://[SERVER.IP]:9000/crossdomain.xml");
socket.connect(hostName, port); //connect to the socket
[rest of original code]

لجعل خادم المقبس يستجيب على الطلب، أضفت ما يلي إلى الخادم:

elseif (preg_match("/policy-file-request/i", $buffer) or preg_match("/crossdomain/i", $buffer)) {
                    socket_write($socket, '<?xml version="1.0"?><cross-domain-policy><site-control permitted-cross-domain-policies="all"/><allow-access-from domain="*" to-ports="9000" /></cross-domain-policy>');
                    unset($read_sockets[array_search($socket, $read_sockets)]);
                    socket_shutdown($socket, 2);
                    socket_close($socket);

ومع ذلك، فإنني أحصل على الخطأ التالي: "تجاهل ملف السياسة في (URL) بسبب مفقود نوع المحتوى." لذلك حاولت إصلاح هذا عن طريق إضافة رأس مباشرة فوق رمز XML الخاص بي:

socket_write($socket, "Content-Type: text/xml\n");

لسوء الحظ، ما زلت أحصل على نفس الخطأ. هل أعطي نوع المحتوى بطريقة خاطئة؟

هل كانت مفيدة؟

المحلول

حاول إرسال هذا:

HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\n\r\n

تأكد من إرسال شيء قبل ذلك. أيضا، أرسل \r\n قبل مغلق المقبس.

نصائح أخرى

تحتاج إلى إرجاع استجابة HTTP صالحة إذا كنت ستستخدم:

Security.loadPolicyFile("http://[SERVER.IP]:9000/crossdomain.xml");

إذا كان الفلاش سوف يتصل بخادم PHP Socket الخاص بك، فما عليك سوى تخطي السطر أعلاه وسيقرك المنفذ نفسه ويتوقع البيانات الخام بدلا من استجابة HTTP.

يمكنك تحميل VICTERNFILE من أي منفذ من الخادم باستخدام Security.LoadPolicyFile () ... ربما يجب أن تخدمها ببساطة لكل HTTP على المنفذ 80، قم بتحميله من هناك ثم الاتصال بالخادم ...

أيضا، بشكل افتراضي، أعتقد أن FlashPlayer 9 (للأعلى من بعض الإصدار الثانري) يرسل طلب عالمي إلى المنفذ 943 افتراضيا ... لذلك قد تضع خادم هناك، للقيام بذلك ...

ملاحظة جانبية صغيرة: PHP لم تصمم أبدا لخوادم المقبس ليست جيدة جدا في ذلك ... إذا كنت تستطيع، فحاول استخدام Java، أو نيكوفم, ، حتى يمكنك استخدام مع هاكسا ... قد يكون من المهم أيضا إعادة صياغة Haxe، بالإضافة إلى ThreadedremotingServer لك ... هناك بعض البرامج التعليمية الجيدة والشفافية على موقع Haxe ...

جربه مع r n بعد نوع المحتوى.

socket_write($socket, "Content-Type: text/xml\r\n");

ألا يجب أن تستخدم XMLSocket على المنفذ 843؟

if(trim($buffer) == '<policy-file-request/>') {
$policy_file =
    '<'.'?xml version="1.0" encoding="UTF-8"?'.'>'.
    '<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFileSocket.xsd">'.
        '<allow-access-from domain="*" to-ports="*" secure="false" />'.
        '<site-control permitted-cross-domain-policies="master-only" />'.
    '</cross-domain-policy>';

socket_write($socket, $policy_file.chr(0));
}

يعمل بشكل جيد بالنسبة لي، سوف يطلب العميل ملف سياسة، افصل، ثم أعد الاتصال بعد تلقي ملف السياسة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top