gdzi lezy blad

0

Witam. Mam taki o to problem. Stworzylem klase, ktora laczy sie uzytkownikami po IP, ktore to najpierw czyta z pliku. Jesli podczas odczytu nie bedzie wpisu w pliku dla danego klienta, to wyswietla sie komunikat 'wpisz adres ip dla tego uzytkownika'. Dla pojedynczego klienta to dziala,jak zaznacze 2lub wiecej, gdy w pliku nie ma zadnego wpisu to tez. Jednak gdy np. ktorys z klientow ma nadany adres ip, to sie z nim probuje polaczyc, ale juz dla kolejnego zaznaczonego, ktory nie ma nadanego ip, nie wyswietla komunikatu ' wpisz adres ip dla tego uzytkownika', chociaz w kodzie to jest zapisane. Gdzie lezy problem? Poniewaz ja juz nie mam pomyslu...

package SYSPOWTCPKOPIA;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import javax.swing.JOptionPane;


public class RepeatingClass {

	Serwer serwerClass;
	protected Socket klient;
	DataInputStream wejscie;
	DataOutputStream wyjscie;
	String msg;
	Clients_Threads cthr;
	int port = 1234;
	String line,lineC;
	File plik,plikC;
	Object line1,line2,line3,line4,line5;
	Object line11,line22,line33,line44,line55;
	Object line111,line222,line333,line444,line555;
	Object line1c,line2c,line3c,line4c,line5c;
	Object line11c,line22c,line33c,line44c,line55c;
	Object line111c,line222c,line333c,line444c,line555c;
	ArrayList file,fileC;
	
	public RepeatingClass(Serwer serwerClass) {
		// TODO Auto-generated constructor stub
		this.serwerClass = serwerClass;
		//System.out.print(serwerClass.line1c);
	}

public void Client1(){
		
		plik = new File("f:/dane.txt");
		file = new ArrayList();
		
		plikC = new File("f:/Contacts.txt");
		fileC = new ArrayList();

		try
		{    
		   BufferedReader inC = new BufferedReader(new FileReader(plikC));

		   while ((lineC = inC.readLine()) != null) 
		      fileC.add(lineC);
		   line1c = fileC.get(0);
		
		   inC.close();
		}catch (IOException e){
			
		  System.out.println(e);
		  
		}catch (IndexOutOfBoundsException e){		
		line1c = "User 1";
		}
		
		try
		{    
		   BufferedReader in = new BufferedReader(new FileReader(plik));

		   while ((line = in.readLine()) != null) 
		      file.add(line);
		   line1 = file.get(0);
		
		   in.close();
		}
		catch (IOException e)
		{
		  System.out.println(e);
		  
		}catch (IndexOutOfBoundsException e){
JOptionPane.showMessageDialog(null, "Wpisz adres ip użytkownika: "+line1c);		
		line1 = "localhost";
		}		
	
		System.out.print("Watek klienta nr 1\n");
		msg = serwerClass.pole1.getText();
		//pierwszy powiadamiany
		try{
		klient = new Socket(line1.toString(),port);
		
		wyjscie = new DataOutputStream(new BufferedOutputStream(klient.getOutputStream()));
		try{
		
		wyjscie.writeUTF(msg);
		}catch(NullPointerException e){
			
		}
		wyjscie.close();
		klient.close();
		if(klient.isConnected())
			System.out.println("Polaczyles sie z " +klient);
			serwerClass.icon1.setIcon(serwerClass.gif_T);
			serwerClass.p1.setEnabled(false);
		
			
		}catch(IOException e){
			System.out.println("Połączenie z "+line1.toString()+" nie udalo sie");
			serwerClass.icon1.setIcon(serwerClass.gif_F);
			serwerClass.p1.setEnabled(true);

		}
		
	}

public void Client2(){
	
	plik = new File("f:/dane.txt");
	file = new ArrayList();

	plikC = new File("f:/Contacts.txt");
	fileC = new ArrayList();

	try
	{    
	   BufferedReader inC = new BufferedReader(new FileReader(plikC));

	   while ((lineC = inC.readLine()) != null) 
	      fileC.add(lineC);
	   line2c = fileC.get(1);
	
	   inC.close();
	}catch (IOException e){
		
	  System.out.println(e);
	  
	  }catch (IndexOutOfBoundsException e){		
	line2c = "User 2";
	}
  
	try
	{    
	   BufferedReader in = new BufferedReader(new FileReader(plik));

	   while ((line = in.readLine()) != null) 
	      file.add(line);
	   line2 = file.get(1);
	   System.out.print(line2);
	
	   in.close();
	}
	catch (IOException e)
	{
	  System.out.println(e);
	}catch (IndexOutOfBoundsException e){
JOptionPane.showMessageDialog(null, "Wpisz adres ip dla użytkownika: "+line2c);
	line2 = "localhost";
	}
		
	System.out.print("Watek klienta nr 2\n");
		msg = serwerClass.pole1.getText();
		//pierwszy powiadamiany
		try{
		klient = new Socket(line2.toString(),port);
		
		wyjscie = new DataOutputStream(new BufferedOutputStream(klient.getOutputStream()));
		try{
		
		wyjscie.writeUTF(msg);
		}catch(NullPointerException e){
			
		}
		wyjscie.close();
		klient.close();
		if(klient.isConnected())
			System.out.println("Polaczyles sie z " +klient);
			serwerClass.icon2.setIcon(serwerClass.gif_T);
			serwerClass.p2.setEnabled(false);
			
		}catch(IOException e){
			System.out.println("Połączenie z "+line2.toString()+" nie udalo sie");
			serwerClass.icon2.setIcon(serwerClass.gif_F);
			serwerClass.p2.setEnabled(true);

		}
}
//i tu nastapni klienci CLient3,4,itd...

//funckje z tej klasy wywoluje w taki sposob w innej klasie, odwolujac sie do klasy z klientami...

if(e.getSource()==wyslij1){
			ramka.dispose();
			if(chxb1.isSelected()){
				//System.out.print("1111111111\n");
				new Thread(){
					public void run(){
						rpc.Client1();	
					}
				}.start();
			}else if(chxb2.isSelected()){
				//System.out.print("2222222222\n");
				new Thread(){
					public void run(){
						rpc.Client2();	
					}
				}.start();
			}else if(chxb3.isSelected()){
				//System.out.print("3333333333\n");
				new Thread(){
					public void run(){
						rpc.Client3();	
					}
				}.start();
			}else if(chxb4.isSelected()){
				//System.out.print("4444444444\n");
				new Thread(){
					public void run(){
						rpc.Client4();	
						}
				}.start();
				//}
				//if(chxb5.isSelected()){
			}else if(chxb5.isSelected()){
				//System.out.print("5555555555\n");
				new Thread(){
				public void run(){
				rpc.Client5();	
				}
				}.start();
		}
	}


0

Hm... pytanie czy będziesz tworzył 1000 metod klientów? Napisz oddzielną klasę klienta, która będzie parametryzowana w odpowiedni sposób. Następnie każdy nowy klient to będzie nowy obiekt. Jeżeli będzie działało dla jednego obiektu to zadziała też dla 100 czy 100000. Na chwilę obecną kod jest tak zamieszany, że błąd może leżeć też w klientach 3, 4, 5, których kodu nie ma. Po pierwsze wydziel kod. W trakcie tego procesu najprawdopodobniej odkryjesz, że coś jest nie tak.

0

O to chodzi,ze probowalem stworzyć taka właśnie klasę,jednak nie udało mi się :-(. Pdpytywałem się trochę,ale nie mogłem tego stworzyć. Po prostu nie wiem jak. Moze masz jakas 'prosta' :-) podpowiedź?A,że czas na napisanie aplikacji powoli się kończy,dlatego zrobiłem to w ten sposob. Jak zrobie w ten właśnie sposob i bedzie dzialala,to nie bede mial juz takiego cisnienia i wtedy sprobuje z jedna klasa. A klienci 3,4 i5 są poprawnie napisani,w analogiczny sposób.

0

Hm.... wiesz co wczytywanie jest jakieś takie nie ładne. ja bym to zrobić troszkę inaczej wykorzystując standardowe narzędzia Java. Dokładnie plik properties:

#plik users.properties
user1.ip=000.000.000.000
user2.ip=000.000.000.001
user3.ip=000.000.000.002
#...

Następnie zamiast buforów spisał po prostu klasę:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class PropLoader {
	Properties properties = new Properties();
	
	public PropLoader(File file) throws FileNotFoundException, IOException{
		properties.load(new FileInputStream(file));
	}
	
	public String getIP(String userName){
		return (String)(properties.get(userName));
	}
}

Jednak pewno masz narzucony format pliku zatem musiał byś stworzyć klasę, która by jednokrotnie wczytywała plik z adresami, a następnie na jego podstawie tworzyła listę z której można by było pobrać dane. Na przykład w taki sposób:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class IpLoader {
	private List<User> uzytkownicy = new LinkedList<User>();

	public IpLoader(File file) throws IOException {
		FileReader fr = new FileReader(file);
		BufferedReader br = new BufferedReader(fr);
		String line = null;
		do {
			line = br.readLine();
			if (line != null)
				dodajUzytkownika(line);
		} while (line != null);
		Collections.sort(uzytkownicy);
	}

	private void dodajUzytkownika(String line) {
		// tu zamieniasz pojedyńczą linię na dane o użytkowniku i dodajesz go do
		// listy.
		User u = new User();
		u.name = line;
		u.ip = line;
		uzytkownicy.add(u);
	}

	public String getIpFromUser(Integer userNumber) {
		Integer ls = uzytkownicy.size();
		if (ls == 0 || userNumber >= ls)
			return null;
		User u = uzytkownicy.get(userNumber);
		return u.ip;
	}

}

class User implements Comparable<User> {
	public String ip;
	public String name;

	// inne właściwości

	public int compareTo(User u) {
		return name.compareTo(u.name);
	}
}

na początek wczytujesz plik linia po linii i na podstawie tych danych tworzysz obiekty użytkowników z danymi. Następnie sortowani są po nazwie i już można sobie ich wybierać po indeksie. Dzięki takiemu podejściu możesz później zrobić:

IpLoader ipLoader = new IpLoader(new File("Contacts.txt"));
String ip = ipLoader.getIpFromUser(1);
if(ip==null)
  //prośba o wpisanie

//dalsza praca programu

ps. to że masz jakiś deadline oznacza, że musisz pisać poprawnie. Warto poświęcić ekstra 5 minuty i napisać coś troszkę inaczej niż później siedzieć pół nocy i szukać błędu.

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