ChatServer

Status
Nicht offen für weitere Antworten.

d3rbastl3r

Bekanntes Mitglied
Hallo,
ich habe mal einenClient und einen Server geschrieben.
Der Client kann zu dem Server einen Text zusenden und der server zu dem Client,
mein Problem ist leider dass wenn ich 2 clients starte dann kann ein Client mit dem server kommunizieren und der zweite auch, leider sendet der server die achricht von dem ersten client nict an den zweiten.

Einer ne ahnung was ich da tun könnte?
Code:
package client_server;

import java.io.*;
import java.net.*;
import java.util.*;

public class server{

    private static int PORT  = 3141;

    public static void main( String args[] )  throws IOException{
      ServerSocket server = new ServerSocket( PORT );

      while(true){
        Socket client = server.accept();
        
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
         
        out.write("Irgend ne nachricht vom server");
        out.newLine();
        out.flush();
        
        String in1 = in.readLine();
        System.out.println(in1);
      }

      //client[0].close();
   }
}

Code:
package client_server;

import java.io.*;
import java.net.*;
import java.util.*;

public class client {

    private static String IP = "localhost";
    private static int PORT  = 3141;

    public static void main( String args[] ) throws IOException{
     Socket server = new Socket (IP, PORT);

     while(true){
         BufferedWriter out = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
         BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));

         // Tastatureingabe
         BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
         String tasteneingabe = read.readLine();

         out.write(tasteneingabe);
         out.newLine();
         out.flush();

         String result = in.readLine();
         System.out.println(result);

         //server.close();
     }
   }
}
 

d3rbastl3r

Bekanntes Mitglied
Ja, Threads habe ich versucht mit auseinanderzusetzen, doch gestern bin ich damit noch garnicht klar gekommen.
Prob: Bastle auch schon ne weile dran, und das Proggi muss bis Montag fertig sein :þ
 

d3rbastl3r

Bekanntes Mitglied
Ok, falls einer mal lust und zeit hat bitte anhand eines kleines Beispiels erklären wie ich Threads einsetze:

Code:
public class Beispiel{
  public void aMethode(){
  }
  
  public void bMethode(){
  }
}

diese 2 Methoden will ich nun parallel ausführen, wie kann ich dieses mit Threads realisieren?
 

merlin2

Top Contributor
Code:
public class Beispiel implements Runnable {
  Thread th_a = new Thread(this);
  Thread th_b = new Thread(this);
  boolean thread = false;
  public Beispiel() {
     th_a.start();
     thread = true;
     th_b.start();
  }
  public void run() {
     if(!thread) aMethode();
     else bMetode();
  }
  public void aMethode() {}
  public void bMethode() {}
}
So würde ich das machen.
 

merlin2

Top Contributor
implements Runnable sorgt dafür, dass jeder Thread, den du startest, deine run-Methode ausführt.
Ich nehme mal an, dass this in diesem Fall dafür sorgt, dass die run-Methode der Klase Beispiel verwendet wird (hat mich nie interessiert, ist aber irgendwie logisch, finde ich).
run wird nur einmal ausgeführt.
Ich bemerke aber, dass mein Beispiel nicht ganz funktioniert: Es läuft immer nur bMethode.
Ist das nur bei mir so, oder ist das Beispiel falsch? :oops:
 

d3rbastl3r

Bekanntes Mitglied
hmm, hab mal getestet, und ich nehme an, dass threading erst dann gestartet wird wenn der Konstruktor vollständig abgearbeitet wurde. In dem Fall wird 'boolean thread' immer auf 'true' gesetzt.

edit: entfernt man hier jedoch die if Bedingung so funktioniert das Programm richtig ^^
 

d3rbastl3r

Bekanntes Mitglied
hmm, habe mich zu früh gefreut, die 2 Methoden laufen nicht parallel sondern nur nacheinander, die erledigt eine while(true) schleife genauso gut.

Wie bringe ich die nun dazu wirklich parallel zu laufen?

edit: ok, merlin2 war schneller :cool:
 

d3rbastl3r

Bekanntes Mitglied
Habe nun rausgefunden wie man die 2 Methoden parallel laufen lässt, leider komme ich trotzdem nicht dahinter wie ich die beide als 2 Threads laufen lassen kann, ohne die beide in verschiedene classen packen zu müssen, denn wie es scheint läuft aMethode als Thread und die bMethode nicht.

Code:
public class Beispiel implements Runnable {
  Thread x = new Thread(this, "x");
  
  public Beispiel() {
    x.start();
    bMethode();
  }
  
  public void run() {
    while(true){
      aMethode();
    }
  }
  
  public void aMethode() {while(true) System.out.println("a");}
  public void bMethode() {while(true) System.out.println("b");}
 
G

Gast

Gast
Auf einem EinKern System kann man keine 2 Threads paralell laufen lassen. Wie denn auch?
 

André B.

Bekanntes Mitglied
d3rbastl3r hat gesagt.:
Habe nun rausgefunden wie man die 2 Methoden parallel laufen lässt, leider komme ich trotzdem nicht dahinter wie ich die beide als 2 Threads laufen lassen kann, ohne die beide in verschiedene classen packen zu müssen, denn wie es scheint läuft aMethode als Thread und die bMethode nicht.
Genaugenommen sind beides Threads. aMethode wird vom Thread "x" ausgeführt und bMethode vom main-Thread. Wenn du nun beide Methoden in unterschiedlichen Threads, aber in der selben Klasse laufen lassen willst (wobei ich nicht verstehe, warum sie in der selben Klasse sein müssen), dann musst du deinen Code etwas umbauen:
Code:
public class Beispiel
{
	Runnable aRunnable, bRunnable;
	Thread aThread, bThread;

	public Beispiel()
	{
		aRunnable = new Runnable()
		{
			public void run()
			{
				aMethode();
			}
		};
		bRunnable = new Runnable()
		{
			public void run()
			{
				bMethode();
			}
		};
		aThread = new Thread(aRunnable, "aThread");
		bThread = new Thread(bRunnable, "bThread");
		aThread.start();
		bThread.start();
	}

	public void aMethode()
	{
		while (true)
			System.out.println("a");
	}
	public void bMethode()
	{
		while (true)
			System.out.println("b");
	}
}
Das geht, indem du einfach annonyme Unterklassen von Runnable erstellst (Zeile 8 & 15). So muss Beispiel nicht Runnable implementieren und du kannst 2 verschiedene Threads aus der selben Klasse starten,
Mfg André
 

d3rbastl3r

Bekanntes Mitglied
So, da ich mich jetzt mit threads eingearbeitet habe wollte ich mal fragen wie ich es anstelle dass der Server eine Nachricht an mehrere, bzw alle cliends versenden kann??
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben