Я попробовал так сделать, и кое-что получилось. На 843 порт, создать сервер-политики не удалось, пришлось создать на 2525, и модифицировать для него as3.
Получилось отправлять данные на сервер, а вот получить что-либо не выходит ((
Вот модифицированный код:
Джава:
Код:
import java.net.*;
import java.io.*;
class FlashSecurityServer
{
public static void main(String[] args)
{
try
{
System.out.println("-> Security server started...");
ServerSocket server = new ServerSocket(2525);
Socket client;
DataOutputStream out;
DataInputStream in;
// Reading crossdomain.xml
FileInputStream xmlFile = new FileInputStream("crossdomain.xml");
int xmlBytesCount = xmlFile.available();
byte[] xmlBytes = new byte[xmlBytesCount + 1];
xmlFile.read(xmlBytes, 0, xmlBytesCount);
xmlBytes[xmlBytesCount] = 0;
xmlFile.close();
byte[] policyRequest = new byte[23];
// for (;;)
// {
client = server.accept();
out = new DataOutputStream(client.getOutputStream());
in = new DataInputStream(client.getInputStream());
in.read(policyRequest, 0, 23);
out.write(xmlBytes, 0, xmlBytesCount + 1);
out.flush();
System.out.println(":: FSS :: Policy sended to " + client.toString());
client.close();
// }
}
catch (Exception e)
{
e.printStackTrace();
}
int port = 8080; // случайный порт (может быть любое число от 1025 до 65535)
SimpleServer(port);
}
static ServerSocket socket;
static Socket incoming;
static BufferedReader readerIn;
static PrintStream printOut;
private static void SimpleServer(int port)
{
System.out.println(">> Starting SimpleServer");
try
{
socket = new ServerSocket(port);
incoming = socket.accept();
readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
printOut = new PrintStream(incoming.getOutputStream());
out("Enter EXIT to exit.\r");
boolean done = false;
while (!done)
{
String str = readerIn.readLine();
if (str == null)
{
done = true;
}
else
{
out("Echo: " + str + "\r");
if(str.trim().equals("EXIT"))
{
done = true;
}
}
}
incoming.close();
}
catch (Exception e)
{
System.out.println(e);
}
}
private static void out(String str)
{
System.out.println(str);
printOut.println(str);
printOut.flush();
}
}
ас3:
Код AS3:
package MultiPlayer
{
import flash.display.Sprite;
import flash.events.*;
import flash.net.*;
import flash.system.Security;
import flash.text.TextField;
public class MultiPlayer extends Sprite
{
private var port:Number = 8080;
private var socket:XMLSocket = new XMLSocket("127.0.0.1",port);
private var textField:TextField = new TextField();
public function MultiPlayer()
{
textField.height = 300;
textField.width = 600;
textField.x = 100;
textField.y = 100;
textField.backgroundColor = 0x00ff00;
textField.background = true;
this.addChild(textField);
socket.connect("127.0.0.1",2525);
try
{
Security.loadPolicyFile("xmlsocket://127.0.0.1:2525");
}
catch(e:Error)
{
textField.appendText("\n no policy find \n");
}
configureListeners(socket);
socket.connect("127.0.0.1",port);
}
private function configureListeners(dispatcher:IEventDispatcher):void
{
dispatcher.addEventListener(Event.CLOSE, closeHandler);
dispatcher.addEventListener(Event.CONNECT, connectHandler);
dispatcher.addEventListener(DataEvent.DATA, dataHandler);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
}
private function closeHandler(event:Event):void {
textField.appendText("\ncloseHandler: \n" + event);
}
private function connectHandler(event:Event):void {
textField.appendText("\nconnectHandler: \n" + event);
socket.send("test\n");
textField.appendText("data sending...\n");
}
private function dataHandler(event:DataEvent):void {
textField.appendText("\ndataHandler: \n" + event);
}
private function ioErrorHandler(event:IOErrorEvent):void {
textField.appendText("\nioErrorHandler: \n" + event);
}
private function progressHandler(event:ProgressEvent):void {
textField.appendText("\nprogressHandler loaded:" + event.bytesLoaded + " total: \n" + event.bytesTotal);
}
private function securityErrorHandler(event:SecurityErrorEvent):void {
textField.appendText("\nsecurityErrorHandler: \n" + event);
}
}
}
как видно по коду, мы в ас3, должны получать сообщения:
Enter EXIT to exit.\r и "Echo: test\r"
Они оба отображаются в консоли джавы, но не передаются в ас3.
Добавлено через 15 часов 35 минут
Спасибо,
bav, код очень сильно помог в преодолении данной проблемы. А не отсылалось обратно сообщения, из-за того, что java не добавляет вконец строки нулевой байт. Если сделать это вручную, все работает =)
Код:
out("Echo: " + str + (char)0);