Klient + serwer

Klient + serwer
KI
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 9 lat
  • Postów:29
0

Cześć,
Mam aplikacje, która działa jako czat na lokalnym serwerze.
Nie rozumiem w niej jednej rzeczy. Skąd obiekt klasy Klient "wie" kiedy do niego coś wyślemy. Wiem, że zajmuje się tym klasa wewnętrzna OdbiorcaKomunikatow ale czy jej metoda run() będzie się wykonywała przez cały czas życia aplikacji?

Klasa klienta:

Kopiuj
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

public class Klient {
	private JTextArea textArea;
	private JTextField textFiled;
	private JFrame frame;
	private JPanel panel;
	private JButton button;
	
	private PrintWriter writer;
	private BufferedReader reader;
	Socket socket;
	
	public static void main(String[] args) {
		new Klient().doDziela();
	}
	
	private void doDziela() {
		frame = new JFrame();
		panel = new JPanel();
		textFiled = new JTextField(20);
		button = new JButton("Kliknij mnie");
		button.addActionListener(new MyButtonListener());
		textArea = new JTextArea(15, 50);
		textArea.setLineWrap(true);
		textArea.setWrapStyleWord(true);
		textArea.setEditable(false);
		JScrollPane scpane = new JScrollPane(textArea);
		scpane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scpane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		
		panel.add(scpane);
		panel.add(textFiled);
		panel.add(button);
		frame.add(panel);
		
		this.konfigurujKomunikacje();
		Thread watekOdbiorcy = new Thread(new OdbiorcaKomunikatow());
		watekOdbiorcy.start();
		
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	private void konfigurujKomunikacje() {
		try {
			socket = new Socket("127.0.0.1", 5000);
			reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			writer = new PrintWriter(socket.getOutputStream());
			System.out.println("Konfiguracja komunikacji przebiegla pomyslnie");
		} 
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private class MyButtonListener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {
			try {
				writer.println(textFiled.getText());
				writer.flush();
			}
			catch(Exception e) {
				e.printStackTrace();
			}
			
			textFiled.setText("");
			textFiled.requestFocus();
		}
	}
		
	class OdbiorcaKomunikatow implements Runnable {
		public void run() {
			String widomosc;
			try {
				while((widomosc = reader.readLine()) != null) {
					textArea.append(widomosc + "\n");
				}
			} 
			catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Klasa Serwer(chyba niepotrzebna ale i tak wrzucam):

Kopiuj
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Serwer {
	private ArrayList strumienieWyjsciowe;
	
	public static void main(String[] args) {
		new Serwer().doRoboty();
	}
	
	public void doRoboty() {
		strumienieWyjsciowe = new ArrayList();
		try{
			ServerSocket servSocket = new ServerSocket(5000);
			
			while(true) {
				Socket gniazdoKlienta = servSocket.accept();
				PrintWriter pisarz = new PrintWriter(gniazdoKlienta.getOutputStream());
				strumienieWyjsciowe.add(pisarz);
				
				Thread t = new Thread(new ObslugaKlientow(gniazdoKlienta));
				t.start();
				System.out.println("Mamy polaczenie");
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void rozeslijDoWszystkic(String message) {
		for(Object x : strumienieWyjsciowe) {
			PrintWriter pisarz = (PrintWriter) x;
			pisarz.println(message);
			pisarz.flush();
		}
	}
	
	class ObslugaKlientow implements Runnable {
		BufferedReader czytelnik;
		Socket gniazdo;
		
		public ObslugaKlientow(Socket gniazdoK) {
			try {
				gniazdo = gniazdoK;
				czytelnik = new BufferedReader(new InputStreamReader(gniazdo.getInputStream()));
			} 
			catch (IOException e) {
				e.printStackTrace();
			}
		}

		public void run() {
			String wiadomosc;
			try {
				while((wiadomosc = czytelnik.readLine()) != null) {
					System.out.println("Odczytano: " + wiadomosc);
					rozeslijDoWszystkic(wiadomosc);
				}
			} 
			catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
edytowany 2x, ostatnio: killermannnnn
niezdecydowany
niezdecydowany
new Klient().doDziela(); :D:D:D taki #SWAG
panryz
this jest bullshit. Nie listeninguj go!
Tumeg
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:687
0

Chyba sam tego nie pisałeś.

Kopiuj
Thread watekOdbiorcy = new Thread(new OdbiorcaKomunikatow());
watekOdbiorcy.start();
RA
  • Rejestracja:około 11 lat
  • Ostatnio:8 miesięcy
  • Postów:93
0
Kopiuj
public void run() {
            String wiadomosc;
            try {
                while((wiadomosc = czytelnik.readLine()) != null) {
                    System.out.println("Odczytano: " + wiadomosc);
                    rozeslijDoWszystkic(wiadomosc);
                }
            } 
            catch (IOException e) {
                e.printStackTrace();
            }
        }
edytowany 1x, ostatnio: Radomiej
Wizzie
ziom, znacznik <code=java> masz
RA
KI
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 9 lat
  • Postów:29
0
Tumeg napisał(a):

Chyba sam tego nie pisałeś.

Kopiuj
Thread watekOdbiorcy = new Thread(new OdbiorcaKomunikatow());
watekOdbiorcy.start();

Wziąłem z ksiązki. A co w tym złego?

Radomiej napisał(a):

public void run() {
String wiadomosc;
try {
while((wiadomosc = czytelnik.readLine()) != null) {
System.out.println("Odczytano: " + wiadomosc);
rozeslijDoWszystkic(wiadomosc);
}
}
catch (IOException e) {
e.printStackTrace();
}
}

No i o to właśnie pytam. czy ta pętla while będzie działać przez cały czas zycia aplikacji?

Tumeg
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:687
0

ale czy jej metoda run() będzie się wykonywała przez cały czas życia aplikacji?

No właśnie dzięki temu wątkowi tak będzie.
http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

edytowany 2x, ostatnio: Tumeg

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.