![]() |
|
||||||||||
|
|||||
|
Регистрация: Aug 2011
Сообщений: 4
|
Никак не могу решить проблему соединения сервера на Java и ActionScript 3.0
Вот код сервера на java (взят с хэлпа Adobe, и немного видоизменен, но незначительно), компилируется в Eclipse import java.io.*;
import java.net.*;
class SimpleServer
{
private static SimpleServer server;
ServerSocket socket;
Socket incoming;
BufferedReader readerIn;
PrintStream printOut;
public static void main(String[] args)
{
int port = 8080;
server = new SimpleServer(port);
}
private 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 void out(String str)
{
System.out.println(str);
printOut.println(str);
printOut.flush();
}
}
package MultiPlayer { import flash.display.Sprite; import flash.events.DataEvent; import flash.events.Event; import flash.events.ProgressEvent; import flash.net.*; 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.addEventListener(Event.CONNECT, onConnect ); socket.addEventListener(Event.CLOSE,onClose); socket.addEventListener(DataEvent.DATA, onSocketData); socket.connect("127.0.0.1",port); } private function onConnect( event:Event ):void { textField.appendText("Соединение для передачи установлено...\n"); } private function onClose( event:Event ):void { textField.appendText("Соединение для передачи прервано...\n"); } private function onSocketData( event:DataEvent ):void { textField.appendText("poly4eno [" + event.type + "] " + event.data); try { socket.send("test\n"); textField.appendText("data sending...\n"); } catch(e:Error) { textField.appendText("fail...\n"); } } } } Возможно проблема с файлом политики XMLсокет соединения. Потому что его просто нет. Я никак не могу понять куда его надо поместить, что бы его автоматически загрузило. Либо, где этот файл должен находиться, что бы можно было написать: я сделал файл crossdomain.xml с текстом: <?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>
и ещё: если закоментить ту часть, де идет цикл, то функция out срабатывает, но данные не передаются в AS3. Если кто-то сталкивался с этими проблемами, можете выложить работающие исходники? |
|
|||||
|
Lorem ipsum
|
Перенесено в раздел "Серверные технологии и Flash".
__________________
Поймай яблоко 2! |
|
|||||
|
Почитайте про подключение к сокетам.
Цитата:
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(843, 128, InetAddress.getByName("192.168.34.36"));
Socket client;
DataOutputStream out;
DataInputStream in;
// Reading crossdomain.xml
FileInputStream xmlFile = new FileInputStream("files/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();
}
}
}
Последний раз редактировалось bav; 29.08.2011 в 15:49. |
|
|||||
|
Регистрация: Aug 2011
Сообщений: 4
|
Я попробовал так сделать, и кое-что получилось. На 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();
}
}
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); } } } Enter EXIT to exit.\r и "Echo: test\r" Они оба отображаются в консоли джавы, но не передаются в ас3. Добавлено через 15 часов 35 минут Спасибо, bav, код очень сильно помог в преодолении данной проблемы. А не отсылалось обратно сообщения, из-за того, что java не добавляет вконец строки нулевой байт. Если сделать это вручную, все работает =) |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:46. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| Action script 3.0 , flash , java , socket |
|
|