Wysłanie wiadomości

0

hej mam mały problem z kodem:

public class dwa
{
  public static void main(String args[])
  {
    ServerSocket sock = null;
    Socket clientSocket = null;
	sock = new ServerSocket(8189);
	  while(true)
	  {
                clientSocket = sock.accept();
                Runnable t = new Watki(clientSocket, i);// i - klient ID = 0,1,2......9
		 Thread r = new Thread(t);// nowy watek dla kazdego klineta
		 r.start();
	  }
   }
}
 
class Watki implements Runnable
{
	public Watki(Socket i, int c)
	{
		incoming = i; id =c;
               pw[id] = new PrintWriter(incoming.getOutputStream(),true);
               br = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
	}
	public void run()
	{
        String msg="";
        while(true)
        {
          msg = br.readLine();
          for (int i = 0; i<10 ; i++)
            pw[i].println(msg);
        }
    }
    private Socket incoming;
    private int id;
    private static PrintWriter[] pw = new PrintWriter[10];
    private BufferedReader br = null;
}

czemu

pw[i].println(msg);

nie wysyla wiadomosci do podlaczonych osob ?? nie odsyla nawet do nadawcy
dzieki za pomoc</cpp>

0

Sprobuj dac pw[i].flush(). Jesl rozumiem kod, to chcesz aby wszystkie wiadomosci byly rozglaszane do kazdego z podpietych klientow? Nie lepiej pomyslec o multicast socketach?
Pozdro.

0

dzięki za odp.

 pw[id] = new PrintWriter(incoming.getOutputStream(),true);

a to "true" nie oznacza wlasnie autoflusha??
zmieniłem i tak, ale niestety nie działa.
Multicast sockety tez odpadają - nie mogę ich użyć.
Najlepsze jest to ze jak PrintWriter nie jest tablica tylko pojedynczym obiektem to ładnie odsyła wiadomość. zrobiłem tablicę i lipa

0

masz racje, przeoczylem
a ten kod sie w ogole kompiluje? nie mozesz uzyc br.readLine() bez lapania wyjatku bo ona rzuca IOException.

0

a druga strona w ogóle czeka na ta wiadomosc?

0

Sluchaj ten kod nie ma prawa dzialac, nie dosc ze sie nie kompiluje na bank, to jeszcze masz race condition w watkach: tworzysz sobie w main watki dla kazdego klienta (id od 0 do 9), i kazdy taki watek startujesz. Zaraz w metodzie run() masz odbieranie wiadomosci od danego klienta i pozniej iterujesz po tablicy. Dla pierwszego watku (id = 0) program wywali sie na drugim elemencie tablicy bo bedzie null, no chyba ze drugi klient (id = 1) podlaczy sie szybciej niz watek id = 0 wysle wiadomosc, ale wtedy moze sie to zdarzyc dla id = 2 itd. Wiem, ze br.readLine() z klienta blokuje dopoki nie zostanie wyslana linia tekstu, ale zakladanie ze najpierw podlaczy sie 10 niezalaznych klientow, zanim ktorykolwiek z nich wysle wiadomosc jest ... slaba. Jak juz to sprawdzaj chociaz czy dany pw[i] != null. Poza tym, main sie tez nie skompiluje bo tam licznik i jest uzywany a nigdy nie jest zadeklarowany.

0
import java.net.*;
import java.io.*;
import java.util.*;
public class dwa
{
  public static void main(String args[])
  {
    ServerSocket sock = null;                              // original server socket
    Socket clientSocket = null;                      // socket created by accept                            // socket input stream
    try
    {
       sock = new ServerSocket(8189);  // create socket and bind to port
       for (int i = 0; i<10 ; i++)
          zajety[i] = false;
       System.out.println("Oczekiwanie na klienta");// wait for client to connect
       while(true)
       { 
          if ( ilu < 10)
	  {
	      ilu ++;
	      clientSocket = sock.accept();
	      for (int i = 0; i<10 ; i++)
	     {
		  if (zajety[i] == false)
                 {
			zajety[i] = true;
			Runnable t = new Watki(clientSocket, i);
		        Thread r = new Thread(t);
		        r.start();
		        break;
		  }
	      }
	  }
      }
   }
   catch (Exception e)
   {
   	  System.out.println("Error " + e.getMessage());
   }
  }
  public static void ustaw(int p)
  {
	 zajety[p] = false;
  }
  public boolean check(int p)
  {
	return zajety[p];
  }
  public void zmien()
  {
	ilu = ilu -1;
  }
  private static boolean[] zajety = new boolean[10];
  private static int ilu = 0;
}
class Watki implements Runnable
{
	public Watki(Socket i, int c)
	{
	    incoming = i; id =c;
	    try
	    {
               pw[id] = new PrintWriter(incoming.getOutputStream(),true);
               br = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
	     }
	     catch(Exception e)
	    {
                System.out.println("biegne");
	     }
	}
	public void run()
	{
	try
	{
            System.out.println("Klient sie podlaczyl");
            boolean czy = true;
            String msg="";
            while(czy)
            {
                 msg = br.readLine();// read msg from client
                 if (msg.substring(msg.length()-3,msg.length()).equals("BYE"))
                {
                   czy = false;
                   obiekt.zmien();
                   obiekt.ustaw(id);
		 }
             for (int i = 0; i<10 ; i++)
            {
		if (obiekt.check(i) && i!=id) //
	       {
                     pw[i].flush();
                     pw[i].println(msg);// send msg to client
	       }
            }
        }
      }
      catch(Exception e)
      {
	 System.out.println("Blad tworzenia strumienia" + e);
      }
      finally
      {
          try
          {
            incoming.close();
            pw[id].close();                                                 // close everything
            br.close();

		  }
		  catch(IOException e)
		  {
			  System.out.println("Nie mozna zamknac polaczenia");
		  }

	  }
    }
    private Socket incoming;
    private int id;
    private static PrintWriter[] pw = new PrintWriter[10];                              // socket output stream
    private BufferedReader br = null;
    private dwa obiekt = new dwa();
}

cały kod, wrzucilem wczesniej tylko to najwazniejsze. To jest wersja robocza.
Klient czeka na odpowiedz bo Jak mowilem jak bylo PrintWriter a nie tablica PrintWriter[] to ladnie odsylalo wiadomosc
dzieki pozdro</cpp>

1 użytkowników online, w tym zalogowanych: 0, gości: 1