![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
[+3 13.02.08]
Регистрация: Apr 2006
Сообщений: 421
|
Всем привет, пытаюсь достучаться до сокета из локально запущенной флешки, для этого использую вот такой код на java со стороны сервера и AS 3.0 со стороны клиента
java package org.editor.sockets;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public final class SocketServer {
private static final int PORT = 8080;
private static ServerSocket SERVER_SOCKET = null;
private static SocketServer INSTANCE = null;
private static String CROSSDOMAIN_XML = "<cross-domain-policy>"
+ "<allow-access-from domain=\"*\" to-ports=\"" + PORT + "\"/>" +
"</cross-domain-policy>";
Runnable _socketListenerProcessor;
public static SocketServer getInstance() {
if (INSTANCE == null) {
INSTANCE = new SocketServer();
}
return INSTANCE;
}
/**
* Init server socket.
*
* @author vovkamorkovka
*/
private boolean initServer() {
try {
SERVER_SOCKET = new ServerSocket(PORT);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
private SocketServer() {
initServer();
_socketListenerProcessor = new Runnable() {
@Override
public void run() {
try {
// Блокирует до тех пор, пока не возникнет соединение:
Socket clientSocket = SERVER_SOCKET.accept();
// Вывод автоматически выталкивается из буфера
// PrintWriter'ом
System.out.println("accept socket");
PrintWriter out =
new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
clientSocket.getOutputStream())), true);
//System.out.println("accept socket:" + CROSSDOMAIN_XML);
try {
System.out.println(
"Connection accepted: " + clientSocket);
BufferedReader in =
new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
// Вывод автоматически выталкивается из буфера
// PrintWriter'ом
while (true) {
String str = in.readLine();
if (str.contains("policy-file-request")) {
out.println(CROSSDOMAIN_XML+"\r\n");
out.flush();
System.out.println("try to load policy");
} else {
if (str.equals("END"))
break;
System.out.println("Echoing: " + str);
out.println(str);
}
}
// Всегда закрываем два сокета...
} finally {
System.out.println("closing...");
clientSocket.close();
}
} catch (IOException e1) {
} finally {
try {
SERVER_SOCKET.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
_socketListenerProcessor.run();
}
public static void main(String args[]) {
SocketServer.getInstance();
while (true) {
}
}
}
package org.editor.sockets.example {
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.net.XMLSocket;
import flash.system.Security;
import flash.text.TextField;
/**
* @author vovkamorkovka
*/
public class SocketsExample extends Sprite {
private var _sendMessageBtn : SimpleButton = null;
private var _connectBtn : SimpleButton = null;
private var _socket : XMLSocket = null;
private var _inputText : TextField;
public function SocketsExample() {
Security.loadPolicyFile("localhost:8080");
_sendMessageBtn = this["sendMessageBtn"] as SimpleButton;
_connectBtn = this["connectBtn"] as SimpleButton;
_inputText = this["logText"] as TextField;
_sendMessageBtn.addEventListener(MouseEvent.CLICK, sendMessage);
_connectBtn.addEventListener(MouseEvent.CLICK, connect);
}
private function connect(event : MouseEvent) : void {
_socket = new XMLSocket();
try {
_socket.connect("localhost", 8080);
}catch(e : Error) {
_inputText.appendText("connect:" + e.toString() + "\n");
}
}
private function sendMessage(event : MouseEvent) : void {
if (_socket == null) {
_inputText.appendText("send message, socket have not bin created\n");
return;
}
try {
_socket.send("salo salo\n");
}catch(e : Error) {
_inputText.appendText("send message," + e.toString() + "\n");
}
}
}
}
Причем не присылает ни в тестовом режиме, ни в режиме локально запущенного Вопроса как всегда два: кто виноват и что делать ![]() p.s. Искал на форуме, много схожих тем, но конкретно этот вопрос не освещается |
|
|||||
|
ветеран форума
|
1) Security.loadPolicyFile("xmlsocket://localhost:8080");
2) при отправке полиси файла надо писать не \r\n а нулевой байт (\0) 3) при тестировании локально нужно разрешить использование сокетов в Settings Manager на сайте адоба, т к 9ый плеер не выдает ошибки "local files are not permitted to use sockets", в отличие от 10го, а просто тупо не шлет
__________________
4am is time to rock |
|
|||||
|
[+3 13.02.08]
Регистрация: Apr 2006
Сообщений: 421
|
Ну у меня десятый плеер стоит, поэтому ошибку такую выдает, это первое. Собственно под дебаг - режимом я и понимаю разрешение через сайт адоби.
Так как ты предложил тоже пробовал и всеравно выдает вышеуказанную ошибку. По поводу нулевого байта в конце, ты прав конечно, но дело в том, что java - сокету НЕ ПРИХОДИТ запрос на crossdomain.xml. Т.е. чтоб его куда - нибудь посылать сначала запрос должен быть, а его - то и нетути. Есть какой - нибудь способ настроить программно флешку так, чтоб ей разрешалось использовать сокеты локально? Мне сокеты и нужны собственно для того, чтобы передавать даные java - части программы, т.е. флешка мне нужна именно запущенная локально Последний раз редактировалось VovkaMorkovka; 24.08.2008 в 16:53. |
|
|||||
|
ветеран форума
|
Хм, т е флешка вообще ничего не спрашивает у сервера? А что клиент говорит? какой тип ошибки?
Плюс в приведенном коде нет проверки на то соединен ли сокет при отсылке. А по java есть вопрос - PrintWriter out разве не рискует быть собранным GC?
__________________
4am is time to rock Последний раз редактировалось DarkLight; 24.08.2008 в 17:18. |
|
|||||
|
[+3 13.02.08]
Регистрация: Apr 2006
Сообщений: 421
|
Клиент молчит, на попытку законнектиться говорит ту ошибку, что ты описал выше
|
|
|||||
|
ветеран форума
|
Ну так значит что-то неправильно в Settings Manager прописано, и потому отказывается соединяться
__________________
4am is time to rock |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:56. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|