Zurück   Flashforum > Flash und Server > Flash mit XML und Webservices

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-09-2008, 17:06   #1 (permalink)
Neuer User
 
Registriert seit: Sep 2008
Beiträge: 7
Smile Flash XMLSocket + C-Server + <policy-file-request>

Hallo Leute,

ich versuche schon seit Tagen meinen Flash-Client und meinen C-Server zu verkuppeln, aber die wollen leider nicht ganz.

Der C-Server klappt zusammen mit einem C-Client einwandfrei. Wenn ich Flash aus der Entwicklerumgebung heraus starte, kommt die Verbindung zu stande und der Client kann auch senden.

Nun habe ich schon erfahren, dass man auf den <policy-file-request> von Flash entsprechend reagieren muss, aber egal was ich gemacht habe, es hat meinen Flash-Client leider nicht zufrieden gestellt! Habe den Request auf Port 843 und Port 12345 beantwortet, trotzdem wartete das Flash-Script die 3 Sekunden Timeout ab und brach die Verbindung ab.

Ein Versuch war zB. so:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFileSocket.xsd"><allow-access-from domain="*" to-ports="*" secure="false" />
<site-control permitted-cross-domain-policies="master-only" />
</cross-domain-policy>
Habe auch auf die terminierende Null am Ende des Sendens geachtet, hat nix geändert

Muss ich einen Header mitsenden oder nur das was ein paar Zeilen höher steht?

Wegen eventuellen Nachfragen folgen die Quellcodes vom Flash-Client und C-Server:

Der Flash-Client:
Code:
var xml_s=new XMLSocket();

var ip:String;
var port:Number;

ip="localhost";
port=12345;

//System.security.loadPolicyFile ("xmlsocket://localhost:12345");


xml_s.addEventListener(Event.CONNECT,xmlsocket);//OnConnect//
xml_s.addEventListener(Event.CLOSE,xmlsocket);//OnDisconnect//
xml_s.addEventListener(IOErrorEvent.IO_ERROR,xmlsocket);//Unable To Connect//
xml_s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
xml_s.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
xml_s.connect(ip,port);


function xmlsocket(Event):void
{
	switch(Event.type)
	{
		case 'IOError':
			//Unable to Connect :(//
			trace("Error");
		break;
		case 'connect':
			//Connected :)//
			trace("Connected!");
		break;
		case 'close':
			//OnDisconnect :( //
			trace("Connection closed!");
		break;
	}
}

function securityErrorHandler()
{
	trace("Security Error!");
}

function socketDataHandler()
{
	trace("DatenHandler: "+ProgressEvent.SOCKET_DATA+"!");
}

xml_s.send("MESSAGE HERE");
Der C-Server:
Code:
#include <windows.h>
#include <winsock.h>
#include <stdio.h>

#define MAX_CLIENTS 10



int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}

int main()
{
  long rc;
  SOCKET acceptSocket;
  SOCKADDR_IN addr;
  char buf[256];
  char buf2[300];

  // zustzliche Variabeln
  FD_SET fdSet;
  SOCKET clients[MAX_CLIENTS];
  int i;

   
  // Winsock starten
  rc=startWinsock();
  if(rc!=0)
  {
    printf("Fehler: startWinsock, fehler code: %d\n",rc);
  }
  else
  {
    printf("Winsock gestartet!\n");
  }

  // Socket erstellen
  acceptSocket=socket(AF_INET,SOCK_STREAM,0);
  if(acceptSocket==INVALID_SOCKET)
  {
    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
  }
  else
  {
    printf("Socket erstellt!\n");
  }

  // Socket binden
  memset(&addr,0,sizeof(SOCKADDR_IN));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(12345);
  addr.sin_addr.s_addr=INADDR_ANY; // gewisse compiler brauchen hier ADDR_ANY
  rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
  if(rc==SOCKET_ERROR)
  {
    printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("Socket an port 12345 gebunden\n");
  }

  // In den listen Modus
  rc=listen(acceptSocket,10);
  if(rc==SOCKET_ERROR)
  {
    printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("acceptSocket ist im listen Modus....\n");
  }

  for(i=0;i<MAX_CLIENTS;i++)
  {
    clients[i]=INVALID_SOCKET;
  }



  while(1)
  {
    FD_ZERO(&fdSet); // Inhalt leeren
    FD_SET(acceptSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufgen
   
    // alle gltigen client sockets hinzufgen (nur die die nicht INVALID_SOCKET sind)
    for(i=0;i<MAX_CLIENTS;i++)
    {
      if(clients[i]!=INVALID_SOCKET)
      {
        FD_SET(clients[i],&fdSet);
      }
    }


    rc=select(0,&fdSet,NULL,NULL,NULL); // nicht vergessen den ersten parameter bei anderen betriebssystem anzugeben
    if(rc==SOCKET_ERROR)
    {
      printf("Fehler: select, fehler code: %s\n",WSAGetLastError());
    }
   
    // acceptSocket is im fd_set? => verbindung annehmen (sofern es platz hat)
    if(FD_ISSET(acceptSocket,&fdSet)) {
      // einen freien platz fr den neuen client suchen, und die verbingung annehmen
      for(i=0;i<MAX_CLIENTS;i++)
      {
        if(clients[i]==INVALID_SOCKET)
        {
          clients[i]=accept(acceptSocket,NULL,NULL);
          printf("Neuen Client angenommen (%d)\n",i);
          break;
        }
      }
    }

    // prfen welcher client sockets im fd_set sind
    for(i=0;i<MAX_CLIENTS;i++)
    {
      if(clients[i]==INVALID_SOCKET)
      {
        continue; // ungltiger socket, d.h. kein verbunder client an dieser position im array
      }
      if(FD_ISSET(clients[i],&fdSet))
      {
        rc=recv(clients[i],buf,256,0);
        // prfen ob die verbindung geschlossen wurde oder ein fehler auftrat
        if(rc==0 || rc==SOCKET_ERROR)
        {
          printf("Client %d hat die Verbindung geschlossen\n",i);
          closesocket(clients[i]); // socket schliessen         
          clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben
        }
        else
        {
          buf[rc]='\0';
          // daten ausgeben und eine antwort senden
          printf("Client %d hat folgendes gesandt: %s\n",i,buf);
		  if (!strcmp("<policy-file-request/>",buf))
		  {
			sprintf(buf2,"<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy>  <allow-access-from domain=\"*\" /></cross-domain-policy>\0");
			printf("senden zurueck: '%s'!\n",buf2);
		  } else
		  {
			// antwort senden
			sprintf(buf2,"Du mich auch %s\0",buf);
			printf("senden zurueck: '%s'!\n",buf2);
		  }
          send(clients[i],buf2,(int)strlen(buf2),0);
        }
      }
    }
  }
}
Ich weiß dass dieses Thema nun sehr lang geworden ist, aber ich hoffe es kann mir jemand einen Tipp geben

Vielen Dank schon im Vorraus!

Gruß Samsara
samsara ist offline   Mit Zitat antworten
Alt 05-11-2008, 21:51   #2 (permalink)
Neuer User
 
Registriert seit: Sep 2008
Beiträge: 7
Kann mir wirklich keiner helfen?

Und warum sehe ich mein eigenes Thema nicht in dem entsprechendem Forum?
Bin auf das Thema nur über meine abonierten Themen gekommen -.-
samsara ist offline   Mit Zitat antworten
Alt 06-11-2008, 10:19   #3 (permalink)
Neuer User
 
Registriert seit: Apr 2002
Ort: Vorm PC
Beiträge: 1.583
Wozu brauchst du \0 ?

Probiere mal damit.
Code:
sprintf(buf2,"<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>");
Gnut ist offline   Mit Zitat antworten
Alt 06-11-2008, 10:23   #4 (permalink)
Neuer User
 
Registriert seit: Apr 2002
Ort: Vorm PC
Beiträge: 1.583
Und der Port ist standardmäßig 843
Gnut ist offline   Mit Zitat antworten
Alt 17-11-2008, 00:53   #5 (permalink)
Neuer User
 
Registriert seit: Sep 2008
Beiträge: 7
Danke Gnut dass du es dir angesehen hast, aber das Problem lag an anderer Stelle!

Habe das Problem gelöst!!

Was war das Problem? Kurzform:
- Falscher Aufruf der Flash-Datei im HTML-Quelltest
- gesendete Daten wurden nicht mit Zeichen 0 (NULL) abgeschlossen


Das mit dem Zeichen NULL habe ich schon versucht zu erzwingen, aber ein String wird eh immer mit diesem Zeichen beendet. Nur leider wurde dieses Zeichen nicht mitgesendet (siehe ganz unten im C-Quelltext):

Falsche Variante: send(clients[i],buf2,(int)strlen(buf2),0);
Richtige Variante: send(clients[i],buf2,(int)strlen(buf2)+1,0);

-.-


Die von Macromedia Flash generierte HTML-Seite war wohl mistig. Mit folgendem Quelltext braucht man anscheinend keine policy-request-Behandlung zu machen:

Code:
...<embed src="xmlSocket.swf" FlashVars="" play="true" loop="true" menu="false" quality="best" width="550" height="400" name="DFlash" allowScriptAccess="sameDomain" swLiveConnect="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" bgcolor="#000000" />...
[EDIT:]
Musste die policy-request-geschichte doch reinmachen, aber die funktioniert einwandfrei mit:
Code:
          printf("Client %d hat folgendes gesandt: %s\n",i,buf);

		  if (!strcmp("<policy-file-request/>",buf))
		  {
			sprintf(buf2,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<cross-domain-policy xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://www.adobe.com/xml/schemas/PolicyFile.xsd\">\n   <site-control permitted-cross-domain-policies=\"all\"/>\n   <allow-access-from domain=\"*\" to-ports=\"*\"/>\n</cross-domain-policy>");
			printf("senden zurueck: '%s'!\n",buf2);
		  } else
		  {
			// antwort senden
			sprintf(buf2,"Du mich auch %s",buf);
			printf("senden zurueck: '%s'!\n",buf2);
		  }
          send(clients[i],buf2,(int)strlen(buf2)+1,0);
[/ EDIT]

Habe nun einen anderen Flash-Quelltext:
Code:
mySocket = new XMLSocket();


mySocket.onConnect = function(success)
{
	if (success)
		msgArea.htmlText += "<b>Server connection established!</b>"
	else
		msgArea.htmlText += "<b>Server connection failed!</b>"
}

mySocket.onClose = function()
{
	msgArea.htmlText += "<b>Server connection lost</b>"
}

mySocket.connect("localhost", 12345);

mySocket.onData = function(msg:String):Void 
{
	msgArea.htmlText +="empfange:"+msg+"!<br>";
}

//--- Handle button click --------------------------------------
function sendMsg()
{
	if (inputMsg.htmlText != "")
	{
		mySocket.send(inputMsg.htmlText + "\n");
		msgArea.htmlText +="gesendet!";		

	}	
}
Auf der Bühne sind 2 Textfelder ("msgArea" und "inputMsg") und ein Button, der beim Klicken die Funktion sendMsg() auslöst.

Das war's schon

Endlich kann ich nun Senden um Empfangen. Nun kann's weiter gehen :]

Gruß Samsara

Geändert von samsara (17-11-2008 um 01:06 Uhr)
samsara ist offline   Mit Zitat antworten
Alt 19-11-2008, 00:01   #6 (permalink)
Neuer User
 
Registriert seit: Apr 2002
Ort: Vorm PC
Beiträge: 1.583
Ich habe bisher nur Socket verwendet und brauche kein \0 am Ende.
Gnut ist offline   Mit Zitat antworten
Alt 21-03-2009, 08:35   #7 (permalink)
aus Berlin
 
Registriert seit: Feb 2002
Ort: Berlin
Beiträge: 516
Hi, hast du dein Problem schon gelöst ? Ich habe mal eigene XMLSocket Server mit С# programmiert und hatte ähnliche Probleme die ich aber gelöst habe, frag mich nicht wie aber, wenn du die Hilfe brauchst sag Bescheid ich suche meine Backups mal durch und sage woran es liegt
ArBr ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele