Witajcie
Ostatnio zajmuje się połączeniem przez socket javy(serwer) i flexa(client) na localhost. Trochę już o tym czytałem i wiem ze już jakiś czas temu dodali wymóg by serwer przesyłał plik xml zawierajacy uprawnienia na prośbe ze strony flasha: <policy-file-request />. Wiem też ze domyślnie pyta o ten plik na porcie 843 a mimo to mam problem.
W javie stawiam serwer i na porcie 843 czekam na request i odsyłam xml'a jako stringa i od razu zamykam ten port(tak niby ma to być). Równocześnie jest otwarty na nasłuch port 1008 na którym ma być głowny transfer danych. Widzę ze flex pyta o plik, ja mu odsyłam i jest ok-zamykam port843 i flesh nie ma błędów-otwiera on łącznośc na 1008 i znowu pierwsze co robi to wysyła <policy-file-request /> co robie nie tak?
PS: Wiem że przekazy uwierzytelniajace musza sie kończyć zerem binarnym.
Oto moje kody:
Java do obsługi zapytania o plik xml:
import java.net.*;
import java.io.*;
public class policyServer843 {
public static void main(String[] args) {
try {
int port = 843;
Socket clientSocket;
String policy = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\0";
System.out.println("Proba powolania serwera na porcie " + port);
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Powolano serwer na porcie " + port);
System.out.println("Oczekiwanie na klienta ... ");
clientSocket = serverSocket.accept();
DataInputStream indata = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
DataOutputStream outdata = new DataOutputStream(new BufferedOutputStream(clientSocket.getOutputStream()));
System.out.println("Klient ... ");
System.out.println("Ilosc bajtow " + indata.available());
byte[] dane = new byte[indata.available()];
indata.read(dane);
String zapytanie = new String(dane);
System.out.println(zapytanie + "<------------");
outdata.writeUTF(policy);
outdata.flush();
System.out.println("POSZLO ... ");
indata.close();
outdata.close();
clientSocket.close();
} catch (Exception e) {
System.err.println("Blad powolania serwera " + e);
}
}
}
Java main connection
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import java.net.*;
import java.io.*;
public class mainConnection {
public static void main(String[] args)
{
try {
int port = 1008;
Socket clientSocket;
System.out.println("Proba powolania serwera na porcie " + port);
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Powolano serwer na porcie " + port);
System.out.println("Oczekiwanie na klienta ... ");
clientSocket = serverSocket.accept();
DataInputStream indata = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
DataOutputStream outdata = new DataOutputStream(new BufferedOutputStream(clientSocket.getOutputStream()));
System.out.println("Klient ... ");
System.out.println("Ilosc bajtow " + indata.available());
byte[] dane = new byte[indata.available()];
indata.read(dane);
String tekstZFlexa = new String(dane);
System.out.println(tekstZFlexa + "<------------");
outdata.writeUTF("test");
outdata.flush();
String text = indata.readUTF();
System.out.println(text + "<------------");
}
catch(Exception e)
{
System.err.println("Blad powolania serwera " + e);
}
}
}
I kod napisany w AS
package test
{
import flash.display.Sprite;
public class testsocket extends Sprite {
public function testsocket() {
trace("PROBA POLACZENIA Z SERWEREM:");
var socket:CustomSocket = new CustomSocket();
}
}
}
import flash.errors.*;
import flash.events.*;
import flash.net.Socket;
import flash.system.Security;
import flash.errors.IOError;
import flash.events.DataEvent;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.Socket;
import flash.system.Security;
import flash.utils.ByteArray;
class CustomSocket {
private var clientSocket:Socket;
private static const port:int = 1008;
private static const host:String = "localhost";
private static const policyPort:int = 843;
public function CustomSocket()
{
trace("Start");
//Security.loadPolicyFile("xmlsocket://"+host+":"+policyPort);
clientSocket = new Socket();
configureListeners(clientSocket);
clientSocket.connect(host, port);
writeUTFfTOSocket("stringTestowy");
}
private function configureListeners(_socket:Socket):void {
_socket.addEventListener(Event.CLOSE, closeHandler);
_socket.addEventListener(Event.CONNECT, connectHandler);
_socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
_socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
_socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
}
public function readUTFfromSocket():void {
trace(clientSocket.readUTF());
writeUTFfTOSocket("stringTestowy");
}
public function writeUTFfTOSocket(doSerwera:String):void
{
clientSocket.writeUTF(doSerwera);
clientSocket.flush();
}
private function closeHandler(event:Event):void {
trace("Zamykanie ...");
trace(event);
}
private function connectHandler(event:Event):void {
var flag:Boolean = clientSocket.connected;
trace("Polaczony: " + flag);
writeUTFfTOSocket("stringTestowy");
}
private function ioErrorHandler(event:IOErrorEvent):void {
trace("Blad IO");
trace(event);
}
private function securityErrorHandler(event:SecurityErrorEvent):void {
trace("BLAD OCHRONY:");
trace(event);
}
private function socketDataHandler(event:ProgressEvent):void {
readUTFfromSocket();
}
}
Serwer javy otrzymuje zapytanie-wysyła plik -zamyka się nawiązuje połączenie na porcie 1008 i dostaje znowu zapytanie o plik uwierzytelniajacy. Co robie źle?