Flash player реализует странную (и, возможно, неработающую?) Модель для обеспечения безопасности в отношении сокетов. Ему нужно получить разрешение от сервера, прежде чем он отправит все, что вы просите, и его способ запросить это, как выясняется, попытаться подключиться к порту 843 на том же сервере, чтобы отправить ему произвольный запрос разрешения XML-строка, и если это не сработает, она отправит ту же XML-строку в тот же сокет, который вы просили. Предполагается, что сервер отвечает ожидаемым образом в любом из подключений, иначе вы получите ошибку. Это происходит автоматически еще до того, как ваш первый байт будет передан.
Чтобы проверить, действительно ли это происходит с вами, проверьте, что получает сервер. Если вы видите некоторые данные XML, хотя вы их и не отправляли, то это именно так: Flash player запрашивает разрешение.
Насколько мне известно, нет способа заставить Flash Player пропустить запрос, поэтому вы должны соблюдать его, если он будет работать.
- Если вы управляете своим протоколом, но не хотите помещать небольшую программу, отвечающую на порт 843, вы должны встроить логику, которую ожидает Flash Player, в ваш протокол. Это должен быть XML, это должно быть самое первое, что видит ваш сокет, но как только это будет сделано, вы можете свободно отправлять и получать любые двоичные данные, какие захотите.
- Если, напротив, вы пытаетесь реализовать какой-то стандартный протокол, который вы не можете изменить, то у вас должен быть ответ сервера на порту 843, где Flash Player собирается стучать.
- Если вы не можете сделать что-либо из этого, вам не повезло.
Больше информации на adobe.com здесь.
Поиск в «файле политики Flash Player» также поможет вам найти много информации об этой проблеме.
В интересах совместного использования, вот как выглядит мой файловый сервер личной политики (в Ruby). Как видите, это может быть довольно просто. Конечно, это не обязательно должен быть Ruby, его можно реализовать на любом языке, который вы хотите, при условии, что он отправляет ответ, который ожидает Flash Player.
#!/usr/bin/ruby -w
require 'socket'
PORT = 843
POLICY_FILE = <<EOF
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="put-your-domain-name-here.com" to-ports="5331" />
</cross-domain-policy>
EOF
gs = TCPServer.new(PORT)
socks = [gs]
while true
begin
nsock = select(socks, nil, nil, 1)
nsock[0].each do |s|
if s == gs
new_sock = s.accept
$stderr.puts "Accepted " + new_sock.to_s
socks.push(new_sock)
else
if s.eof?
$stderr.puts "Closed " + s.to_s
s.close
socks.delete s
else
$stderr.puts s
s.write POLICY_FILE
s.close
socks.delete s
end
end
end unless nsock.nil?
rescue Errno::EAGAIN, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR
$stderr.puts "Info : exc"
retry
end
end