Klient + serwer

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:

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):

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();
			}
		}
	}
}
0

Chyba sam tego nie pisałeś.

Thread watekOdbiorcy = new Thread(new OdbiorcaKomunikatow());
watekOdbiorcy.start();
0
public void run() {
            String wiadomosc;
            try {
                while((wiadomosc = czytelnik.readLine()) != null) {
                    System.out.println("Odczytano: " + wiadomosc);
                    rozeslijDoWszystkic(wiadomosc);
                }
            } 
            catch (IOException e) {
                e.printStackTrace();
            }
        }
0
Tumeg napisał(a):

Chyba sam tego nie pisałeś.

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?

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

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