Ich suche jetzt schon die ganze Zeit nach Hinweisen wie man Dateien per NetworkStream versenden kann.
Könnte man eine Datei in byte[] umwandeln.versenden und dann wieder von byte[] in Datei umwandeln ?
Danke Programmierhans für den Hinweis,aber ich will es erstmal mit meiner Methode probieren.
Es geht auch alles soweit nur wenn ich einen farbigen Text in TextBox1 eingebe wird dieser Text nicht so in TextBox2 dargestellt.Man kann auch leider nicht die RTF Codes zusammenfügen
Ich denke viele kennen ICQ und dort gibt man seinen Text ein und klickt auf senden. Der eigene Name wird anders farbig dargestellt als der von gegenüber. Ich möchte das in meinem Chat Programm auch so haben.
Ich nutze dazu die RichTextBox.
this.textBox2.Text=this.textBox2.Text+"\r\n"+Environment.UserName+" schrieb um "+DateTime.Now.ToString("H:mm:ss")+" "+ this.textBox1.Text;
String text=Environment.UserName+" schrieb um "+DateTime.Now.ToString("H:mm:ss")+" "+ this.textBox1.Text;
this.textBox2.SelectionStart=this.textBox2.TextLength-text.Length;
this.textBox2.SelectionLength=user.Length;
this.textBox2.SelectionColor=Color.Red;
this.textBox2.SelectionFont=new Font("Comic Sans",15);
So wird der Name zwar anders hinterlegt aber bei nächsten Senden wird nur der Name welcher als letzten geschrieben wurde markiert.
Eigentlich ganz logisch
Wenn ich die ganze Form hinzufüge sieht das ja nicht so schön aus (Form im Form ) ,deswegen habe ich mich lieber für das Panel entschieden.
Das ist mir klar und ich bin auch vertraut mit der OO
Aber bei diesem Problem finde ich irgendwie keine Lösung und ich bin keiner von denen die direkt Fragen ohne vorher nachzudenken!!
Mir ist klar das wenn ich alles in eine Klasse schreibe es einfach ist die Form zu überschreiben.Aber ich habe nun mal eine 2.Klasse wo das 2.Fenster aufgebaut ist und dieses 2.Fenster möchte ich gerne in der 1.Form anzeigen lassen.
Original von Programmierhans
Sorry ich will Dich ja wirklich nicht beleidigen, aber ich empfehle Dir mal ein gutes Buch über .Net und OO zu lesen, damit Du mal die Grundkonzepte der OO-Entwicklung kennenlernst ...
Ein Buch kannst jedem Empfehlen der eine Frage hat und sich damit selber auseinandersetzten soll.
Aber Danke für den Tipp mit dem UserControl mal schauen wie das so geht
Mit Menü waren Buttons gemeint wo halt der Modus drauf steht und nicht die Menübar.Aber das mit dem löschen war mir schon klar nur wie lade ich die neuen Komponenten in die Form?
Je nachdem ob der User Singleplayer oder Multiplayer auswählt soll eine andere Klasse geladen werden.Die Klassen habe ich jeweils in eine dll Datei geschrieben (ein komplettes Fenster) .Nun will ich aber dass sich kein neues Fenster öffnet sondern dass das alte Fenster mit dem Menü überschrieben wird. Also das gleiche als würde eine neue InitializeComponent() geladen werden.
Ich will hat diesen Übergangseffekt vermeiden wo sich ein Fenster schließt und ein neues öffnet.
Je nachdem ob der User Singleplayer oder Multiplayer auswählt soll eine andere Klasse geladen werden.Die Klassen habe ich jeweils in eine dll Datei geschrieben (ein komplettes Fenster) .Nun will ich aber dass sich kein neues Fenster öffnet sondern dass das alte Fenster mit dem Menü überschrieben wird. Also das gleiche als würde eine neue InitializeComponent() geladen werden.
Ich will hat diesen Übergangseffekt vermeiden wo sich ein Fenster schließt und ein neues öffnet
Original von Programmierhans
Im ersten Codeblock sendest Du ein leeres ByteArray ! GuckstDu Encoding.GetBytes an....
und im zweiten Codeblock läuft er nur einmal direkt durch (weil DataAvailable noch auf false ist).... da muss ne Schlaufe hin (und das ThreadSleep nicht vergessen)
Ich lass Dich nicht ganz hängen, aber alles will ich ja auch nicht für Dich coden... sonst lernst Du ja nichts....
//prüfe ob für offene Clients Daten da sind
foreach (TcpClient client in this._HtClients.Keys)
{
NetworkStream ns=this._HtClients[client]as NetworkStream;
if (ns.DataAvailable)
{
//oho wir haben Daten erhalten
Stream outStream=client.GetStream();
byte[] bytes=new byte[client.ReceiveBufferSize];
int intBytesRead=ns.Read(bytes,0,client.ReceiveBufferSize);
String j=Encoding.Default.GetString(bytes,0,intBytesRead);
outStream.Write(bytes,0,intBytesRead); //Daten an Client senden?
//MessageBox.Show(j);
this.label9.Location=new Point(Spieler.spieler1x[int.Parse(j)],Spieler.spieler1y[int.Parse(j)]);
this.Refresh();
iHadWork=true;
}
}
this._TcpClientSender=new TcpClient();
this._TcpClientSender.Connect(IPAddress.Parse("127.0.0.1"),6667);
this._SendStream=this._TcpClientSender.GetStream();
_HtClients2.Add(this._TcpClientSender,this._TcpClientSender.GetStream());
foreach (TcpClient client in _HtClients2.Keys)
{MessageBox.Show("kdöl");
NetworkStream ns=this._HtClients2[client]as NetworkStream;
if (ns.DataAvailable)
{
//oho wir haben Daten erhalten
Stream outStream=client.GetStream();
byte[] bytes=new byte[client.ReceiveBufferSize];
int intBytesRead=ns.Read(bytes,0,client.ReceiveBufferSize);
String j=Encoding.Default.GetString(bytes,0,intBytesRead);
outStream.Write(bytes,0,intBytesRead);
//MessageBox.Show(j);
this.label9.Location=new Point(Spieler.spieler1x[int.Parse(j)],Spieler.spieler1y[int.Parse(j)]);
this.Refresh();
//iHadWork=true;
}
}
Ich hoffe ihr denkt jetzt nicht was macht der da für ein Quatsch aber ich verstehe nicht wie ich das umsetzten soll X(
Thread.Sleep und Thread.Join sind mir bekannt, ich weiß aber nicht wo ich das anwenden soll
Ich denke du meinst ich soll das Senden der Daten an Client schlafen legen wenn es nix zu gibt.Aber woher soll die Methode wissen wann die Spielfigur sich bewegt ??
Mit this.label9.LocationChanged+=new EventHandler(label9_LocationChanged); wird bei Location änderung eine Methode aufgerufen und müsste dann die Daten an den Client gesendet werden
Ich finde das mit native TCP/IP einfacher und habe es mal damit Versucht.
1.Problem der Thread
public class ServerThread
{
// Stop-Flag
public bool stop = false;
// Flag für "Thread läuft"
public bool running = false;
// Die Verbindung zum Client
private TcpClient connection = null;
// Speichert die Verbindung zum Client und startet den Thread
public ServerThread ( TcpClient connection )
{
// Speichert die Verbindung zu Client,
// um sie später schließen zu können
this.connection = connection;
// Initialisiert und startet den Thread
new Thread ( new ThreadStart ( Run ) ).Start ();
}
// Der eigentliche Thread
public void Run ()
{
// Setze Flag für "Thread läuft"
this.running = true;
// Hole den Stream für's schreiben
Stream outStream = this.connection.GetStream ();
int buf = 0;
bool loop = true;
while ( loop )
{
try
{
// Hole die aktuelle Zeit als String
int i = Form1.i;
// Sende Zeit nur wenn sie sich von der vorherigen unterscheidet
if ( i!=buf )
{
// Wandele den Zeitstring in ein Byte-Array um
// Es wird noch ein Carriage-Return-Linefeed angefügt
// so daß das Lesen auf Client-Seite einfacher wird
Byte[] sendBytes = Encoding.ASCII.GetBytes ( i + "\r\n" );
// Sende die Bytes zum Client
outStream.Write ( sendBytes, 0, sendBytes.Length );
// Merke die Zeit
buf = i;
}
// Wiederhole die Schleife so lange bis von außen der Stopwunsch kommt
loop = !this.stop;
}
catch ( Exception )
{
// oder bis ein Fehler aufgetreten ist
loop = false;
}
}
}
public void close()
{
// Schließe die Verbindung zum Client
this.connection.Close ();
// Setze das Flag "Thread läuft" zurück
this.running = false;
}
}
Ich bin nach der Anleitung auf http://www.microsoft.com/germany/msdn/library/net/csharp/NetworkingMitCSharp.mspx vorgegangen.
Hier wird die Schleife in der run() ja solange durchlaufen bis die Verbindung getrennt wird.Ich will aber dann Daten senden wenn sich die Spielfigur bewegt und somit die 100% Prozessor auslastung vermeiden.
2.Problem der Client
Der Client stürzt ab was aber auch an der 100% Prozessor auslastung liegen könnte.Den es müsste eigentlic alles stimmen:
private void client()
{
// Verbindung zum Server aufbauen
c = new TcpClient ( "localhost", 4711 );
// Stream zum lesen holen
String buff=null;
StreamReader inStream = new StreamReader ( c.GetStream () );
if(inStream.ReadLine().ToString()!=buff)
{
try
{
MessageBox.Show(inStream.ReadLine().ToString());
// Hole nächsten Zeitstring vom Server
/*int j= int.Parse(inStream.ReadLine ());
this.label9.Location=new Point(Spieler.spieler1x[j],Spieler.spieler1y[j]);
this.Refresh();*/
buff=inStream.ReadLine().ToString();
}
catch ( Exception )
{
// Setze das Schleifen-Flag zurück
// wenn ein Fehler in der Kommunikation aufgetreten ist
this.clientclose();
}
}
}
Eine Verbindung zum Server wird per Buttonklick hergestellt
Ich verstehe nicht wie ich das bei mir einbauen kann X( Also was ich vor habe ist ein kleines Brettspiel welches je nach Auswahl alleine oder im Netzwerk gespielt werden kann.
Wenn Multiplayer ausgewählt wurde geht es auf das Spielfeld wo Spieler1 würfelt und die Spielfigur bewegt sich.Spieler2 soll den den gewürfelten Wert sehen zB in einer TextBox oder MessageBox und auch wie sich die Spielfigur bewegt.
Später kommen da noch andere Dinge hinzu die Spieler2 erfahren muss.
Klickt der Spieler auf Würfeln passiert folgendes:
private void button1_Click(object sender, System.EventArgs e)
{
int zuz=zz.Next(1,6);
this.textBox1.Text=zuz.ToString();
for(int j=1;j≤zuz;j++)
{
if(i==8)
{
i=0;
}
this.label9.Location=new Point(Spieler.spieler1x[i],Spieler.spieler1y[i]); // Die Punkte kommen aus einem Array
i++;
this.Refresh();
Thread.Sleep(600);
}
}
Nun müsste beim Multiplayer ja die Location an den Client (Spieler2) gesendet werden.Dazu könnte man eine Methode schreiben welche die Location an alle verbunden IPs schicken bis auf die eigene IP.