Compact Framework im gleichen Programm Server und dazugehoerigen Client laufen lassen

Blue_Fox

Mitglied
Hi

Ich hoffe mal ich schreib den post an die richtige stelle :-(

Was mach ich gerade:

Ich will eine Steuerung mit einem Touchpanel bauen. Es soll spaeter mehrere Panels geben, die miteinander ueber UDP/TCP kommunizieren. UDP deshalb, weil die Panels die Adresse des Servers erst durch, den fuer die Aufgabe zustaendigen Server, erfahren. Auf dem Touchpanel soll die GUI und der Controller gleichzeitig laufen!! und das am besten in ein und dem selben Programm!! :(

Soviel hab ich schon gemacht und gefunden:

Oberflaeche arbeitet schon einwandfrei. Den Server und Client hab ich in extra Threads gepackt....

Mein Problem:

Mein UDP Server geht auf Listen und wartet, jetzy kommt mein UDP Client, unterbricht den ServerThread, Sendet seine Anfrage und wartet aufeine Antwort.... Die aber nie kommt, da ja der Serverthread noch unterbrochen ist!! :(:(:(

Dann hab ich mal so im i-Net geschaut und bin auf den Backgroundworker gekommen, der aber in Compackt Framework 3.5 gar nicht existiert...

Welche Funktion gibt es noch, mit der ich Server und Client gleichzeitig laufen lassen kann****

MFG
Blue_Fox

PS: Sorry bin richtiger C# und .Net Anfaenger....
 
Hi und herzlich willkommen auf tutorials.de

Darf ich fragen, warum die Kommunikation zwischen beiden Parts über UDP und damit über Netzwerk geht? :confused:
Der Sinn hinter so einer Architektur liegt darin, Server und Client auf getrennten Maschinen laufen zu lassen und über ein Netzwerk kommunizieren zu lassen. Die Kommunikation innerhalb einer Anwendung über das Netzwerk lauf zu lassen halte ich für sehr kontraproduktiv
 
Hi

Ja da stimm ich dir zu... :D

Aber spaeter soll es mehrere solcher Panels geben, von denen jedes eine GUI und ein Controller ist.... :) und jede Gui sollte auf jeden Controller zugreifen koennen...

Da ist es einfacher gleich alles ueber das Netz zu machen (finde ich zumindest)...

Einen ersten loesungsansatz hab ich jetzt schon!! funktioniert aber immer nur bei einer Datenuebertragung bei der 2. kommt nichts mehr an :(

und zwar lasse ich nur den Server in einem extra Thread laufen und den Client etwa so...

Das ist jetzt mein UDP Client (wurde nicht von mir so programmiert, ist glaub ich schongar von hier :))

Code:
public string Udp_Client_All(string Room){
				IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
				Udp_Client_Send(Room,sender);
				string IpAddress = null;
				IpAddress = Udp_Client_Receive(sender, Room);
				return IpAddress;
		}
		// Send a Controller request for a special Room/Group
		private void Udp_Client_Send(string Room, IPEndPoint sender){
			Byte[] sendBytes = Encoding.ASCII.GetBytes(Room);
			udpClient.Send(sendBytes, sendBytes.Length, "255.255.255.255", 9050);
		}
		// Recives the IP Address and a Room/Group acknowledge
		private string Udp_Client_Receive(IPEndPoint sender, string Room){
			Byte[] receiveBytes = udpClient.Receive(ref sender);
			string Message = Encoding.ASCII.GetString(receiveBytes,0,receiveBytes.Length);
			string senderIP = sender.Address.ToString();
			if(Message == Room){
				return senderIP;
			}
			else{
				return null;
			}
		}

Die initialisierung meiner Threads (Hauptkommunikation soll ueber TCP laufen)
Code:
public void StartController(){
			Thread ControllerTCPServer = new Thread(new ThreadStart(StartTCPServer));
			Thread ControllerUDPServer = new Thread(new ThreadStart(StartUDPServer));
			ControllerUDPServer.Start();
			ControllerTCPServer.Start();
		}
		private void StartTCPServer(){
			tcpServer.TCP_Server_All(lights);
		}
		private void StartUDPServer(){
			udpServer.udp_Server_All(rooms);
		}

und zum schluss noch der UDP Server
Code:
public void udp_Server_All(List<Room> rooms){
     		UdpClient newsock = new UdpClient(ipep);
     		ListenforMessage(rooms,newsock);
     		//newsock.Close();              *MUSS ICH DEN WIEDER SCHLIESSEN ODER NICHT****
     	}
		// Wait for any UDP-Recieve
		private void ListenforMessage(List<Room> rooms, UdpClient newsock){
     		IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
    		Message = newsock.Receive(ref sender);
    		string Room = Encoding.ASCII.GetString(Message,0,Message.Length);
    		int count = rooms.Count;
    		for(int i=0; i<count; i++){
    			if(Room == rooms[i].GetRoomDesc()){
    				udp_Server_send(newsock, sender, Room);
    				break;
    			}
    		}
		}
     	// Send an Acknowledge
		private void udp_Server_send(UdpClient newsock, IPEndPoint sender, string Message){		
      		data = Encoding.ASCII.GetBytes(Message);
      		newsock.Send(data, data.Length, sender);
		}
	}

So ich hoffe Ihr kenn euch aus...

Kann das so gehen wie ich es mache****

Wie gesagt bin nicht gut im programmieren, wenn einer irgendeinen Verbesserungsvorschlag hat bitte her damit!!

MFG

Blue_Fox
 
Zurück