Flex-Java Socket na localhost- security problem

0

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?

0

hehe Eureka:)

Od zawsze komunikując się ze sprzętem etc używałem tylko strumieni bajtowych...i raz mnie pokusiło by wysłać stringa w UTF:P I tu był błąd oczywiśćie bo dodajac zero binarne już z tym sobie poradzić nie umiał.
Dla zainteresowanych dajcie writeBytes i tyle;

1 użytkowników online, w tym zalogowanych: 0, gości: 1