DesktopVideoStream-Programm fürs internet

Gaara-BTK

Grünschnabel
hi,
Ich hatte mich mit norbert_E(sorry wenn das falsch geschrieben ist) unterhalten,wegen einem Problem.
Es handelt sich um ein Programm was den Desktop aufnimmt und dann diese Daten(Bilder) an einen Clienten schickt,der diese dann angezeigt bekommt(eine art Video).

Achja und glaubt mir ich hab schon 8 Stunden gegoogelt.


Quellcode(nur wesentlichste Teile,wei nobert_E es wollte):

Client:
Code:
try
			{
				
					serversocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
					serversocket.Blocking = true ;
					IPHostEntry IPHost = Dns.Resolve(connectTo);
					IPAddress[] addr = IPHost.AddressList; 
					IPEndPoint ipepServer = new IPEndPoint(addr[0], 8090);
					serversocket.Connect(ipepServer);
					clientsocket = serversocket; 
					//System.Console.Write("Verbindung zum Server hergestellt!");
					eins = "Verbindung zum Server hergestellt!";
					this.label1.Text = this.label1.Text + eins;

					Thread MainThread = new Thread(new ThreadStart(listenclient));
					MainThread.Start();
				
			} 
			catch
			{
				//System.Console.WriteLine("Fehler beim Aufbau der Verbindung!")
				this.label1.Text = "Fehler beim Aufbau der Verbindung!";
			}

.....
private void listenclient()
		{
			try
			{
				while (clientsocket != null)
				{
					byte []buffer = new byte[36769];
					int iBytes = clientsocket.Receive(buffer);
					//string rec = System.Text.Encoding.ASCII.GetString(buffer);
					//rec = rec.Substring(0, iBytes);
					MemoryStream ms = new MemoryStream(buffer);
					Image im = Image.FromStream(ms);
					this.pictureBox2.BackgroundImage = im;
					this.label1.Text = "Bild übertragen";
				}
			}
			catch
			{
				//Console.WriteLine("Error!");
				this.label1.Text =  "Error!";
			}
		}

Server:
Code:
void starteServer()
		{
			
			Socket serverSocket = new Socket(AddressFamily.InterNetwork, 
				SocketType.Stream, 
				ProtocolType.Tcp);
			
			serverSocket.Blocking = true;

			IPHostEntry IPHost = Dns.Resolve(this.serverIP); 
			IPAddress[] addr = IPHost.AddressList; 
			
			IPEndPoint ipepServer = new IPEndPoint(addr[0], 8090);
			serverSocket.Bind(ipepServer);
			serverSocket.Listen(10);
			
			
			this.label2.Text = "Server wartet auf Client...";
			
			//while ( true ) 
			//{
				
				this.clientsock = serverSocket.Accept();
				if ( this.clientsock.Connected ) 
				{
					
					this.label2.Text = "Client connected...";
					Thread tc = new Thread(new ThreadStart(listenclient));
					tc.Start();
					while (!tc.IsAlive);							
				}
			//}
		}

		private void listenclient()
		{
			string	command = "";					//Befehl als string
			byte	[]bytes = new byte[1024];		//Befehl in bytes

			while (clientsock!=null)		
			{
				
				try
				{
					int rcount = clientsock.Receive(bytes, bytes.Length, 0);
					command = System.Text.Encoding.ASCII.GetString(bytes);
					command = command.Substring(0, rcount);
					string []cmdlist = null;
					cmdlist = command.Split(' ');
					command = cmdlist[0];	
				}
				catch
				{
					
					this.label2.Text = "Fehler beim Empfangen! Verbindung abgebrochen?";
					clientsock.Close();
					clientsock=null;
				}
				/////////////////////
				//Command = get_File
				/////////////////////
				if (command == "get_File")
				{
					try
					{
						string	pfad;							//Pfad zur speziellen Beispieldatei
						byte	[]puffer = new byte[36769];		//Puffer für gesendete Bytes
						long	lBytesRead=0;					//wie viele Bytes wurden gelesen
						long	filesize=0;						//wie groß ist die Datei				

											
						
						pfad ="testxxx.jpg";
						
						FileInfo fi = new FileInfo(pfad);
						if (fi.Exists)
						{
							
							this.label2.Text = "Datei wird zum Client übertragen!";
							filesize = fi.Length;
							FileStream fs = new FileStream(pfad, FileMode.Open, FileAccess.Read);
							
							NetworkStream ns = new NetworkStream(clientsock);
							
							
							while (lBytesRead < filesize && ns.CanWrite)
							{
								int iBytesRead = fs.Read(puffer, 0, puffer.Length);
								ns.Write(puffer, 0, iBytesRead);
								lBytesRead += iBytesRead;
								
							}
							fs.Close();												
						}
						else
							this.label2.Text = "Datei nicht gefunden!";
						
				        }
					catch
					{
						
						this.label2.Text = "FEhler beim Senden! Steht die Verbindung noch?";
					}
				}
					/////////////////////
					//Command = UNGÜLTIG
					/////////////////////
				else
				{
					
					this.label2.Text = "Kein gültiger Befehl: {0}" + command;
				}
			}  //while
		}

Bei Fragen...bitte einfach fragen ^^

Mfg Gaara
 
leider kann ich dir net wirklich weiterhelfen... nur soviel, dass ich (glaube ich) auf Codeproject.com schonmal was ähnliches gesehen habe...
Vielleicht hast du ja glück und findest es!

Viel Glück auf jeden Fall weiterhin mit deinem Programm und einen schönen Tag noch!

Gruß Marc



Nur mal soweit fürn Anfang:

CodeProject
 
Zuletzt bearbeitet:
also...ich hab jetzt rausgefunden, das ich nen fehler hab...man sieht ja,das ich die daten raus lese aus dem stream,und das so lange mach bis nix mehr gesendet wird. großer denkfehler ^^

Also lasse ich die daten folgendermaßen auslesen.
Code:
       byteArray = new byte[ms.Length];
       count = ms.Read(byteArray, 0, 10);
       // Read the remaining bytes, byte by byte.
	while(count < ms.Length)
	{
		byteArray[count++] = Convert.ToByte(ms.ReadByte());
        }

So ....jetzt ist die Frage,wie ich desen Byte Array in ein Image umwandle!
Ich hab ja zuerst per:
Code:
Image im = Image.FromStream(ms);
umgewandelt,jedoch geht das jetzt nicht mehr.

Wie mach ich das?
Hat einer ne Ahnung oder vielleicht ne Idee?

Thx for HELP

MfG Gaara[BTK]
 
Indem du dein Bytearray in einen MemoryStream schreibst, dann funktioniert FromImage auch wieder :) Methode Write ist das was du brauchst.
 
ja ... ^^ ähm..... diese Daten les ich ja schon aus dem MemoryStream heraus

Ich hab ganz am anfang die Datei(Bild) ausgelesen und dann diese Daten in den Stream geschrieben.

Jetzt zum Clienten,der die Daten wieder aus dem Stream auslesen muss!

als ich die daten folgenderweise ausgelesen hatte gab es das 5% Prob.
Code:
while (clientsocket != null)
	{
		byte []buffer = new byte[36769];
		int iBytes = clientsocket.Receive(buffer);
		MemoryStream ms = new MemoryStream(buffer);
		Image im = Image.FromStream(ms);
		this.pictureBox2.BackgroundImage = im;
		this.label1.Text = "Bild übertragen";
	}
hier wird das 1 mal durchgeführt und beim 2. durchlaufen(clientsocket != null) bricht das beim Darstellen ab.

Also hab ich mir gedacht,das ich die Daten erst auslese und dann als image(daten) nehme.
Das Auslesen des Streams mit den vorhandenen Daten:
Code:
       MemoryStream ms = new MemoryStream(buffer);

       byteArray = new byte[ms.Length];
       count = ms.Read(byteArray, 0, 10);
       // Read the remaining bytes, byte by byte.
	while(count < ms.Length)
	{
		byteArray[count++] = Convert.ToByte(ms.ReadByte());
        }
so....jetzt hab ich die Daten von dem Stream ja da.Diese liegen jetzt in dem byteArray.

Um das Image zu "convertieren", hab ich mir folgendes gedacht:
Code:
MemoryStream ms = new MemoryStream(buffer)
Image im = Image.FromStream(ms);
this.pictureBox2.BackgroundImage = im;
this.label1.Text = "Bild übertragen";

////// hier  das aber nur,das das erste paket was vom stream ausgelesen wurde umgewandelt wird.
Das Problem ist aber,dass ich die Daten ja schon ausgelesen hab und diese im ByteArray liegen.
Wie kann ich diese Daten nun in ein Bild convertieren?

Thx for help!

MfG Gaara[BTK]
 

Neue Beiträge

Zurück