Komunikacja klient-serwer sockety

0

Witam, mam za zadanie napisać aplikację sieciową realizującą rysowanie po panelu, w taki sposób by także host widział to co rysuję. Mam jednak problem z komunikacją. Serwer odbiera od klienta tylko raz zadany ciąg znaków i potem wisi na metodzie read() niezależnie od tego ile razy jeszcze spróbuję nawiązać połączenie. Serwer i klienta tworzę w osobnych wątkach. Fragmenty kodu:

public final class MainWindow extends JFrame {
	private class ServerThread extends Thread {

		public void run() {
			try {
				System.out.println("Starting server...");
				ServerSocket server = new ServerSocket(Integer.parseInt(portTextField.getText()));
				InputStream serverReader;
				while (true){
					System.out.println("Server started. Listening...");
					Socket receiver = server.accept();
					System.out.println("Connection accepted. Client's IP: " + receiver.getLocalAddress());
					serverReader = receiver.getInputStream();
					System.out.println("Printing input:");
					int c;
					while ((c = serverReader.read()) != -1) {
				              System.out.print((char) c);
					}
					System.out.println();
					serverReader.close();
					receiver.close();
					//this.wait();
				}
			} catch (IOException ex) {
				System.out.println("Server IOException!:");
				System.out.println(ex.getLocalizedMessage());
			} finally {
				System.out.println("Server Thread shutting down...");
			}
		}
	}
	
	private class ClientThread extends Thread {
		
		public void run() {
			try {
				String wyjscie = new String ("Test");
				System.out.println("Strarting client...");
				Socket client = new Socket(hostTextField.getText(), Integer.parseInt(portTextField.getText()));
				OutputStream output = client.getOutputStream();
				output.write(wyjscie.getBytes());
				output.flush();
			} catch (IOException ex){
				System.out.println("Client IOException!:\n");
				System.out.println(ex.getLocalizedMessage());
			}
		}
	}
        	private Button getStartServerButton() {
		if (startServerButton == null) {
			startServerButton = new Button();
			startServerButton.setBounds(new Rectangle(500, 57, 94, 24));
			startServerButton.setLabel("Start server");
			startServerButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if (server == null){
						server = new ServerThread();
						server.start();
					}
				}
			});
		}
		return startServerButton;
	}

        private Button getConnectButton() {
		if (connectButton == null) {
			connectButton = new Button();
			connectButton.setBounds(new Rectangle(368, 57, 120, 26));
			connectButton.setLabel("Connect");
			connectButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					ClientThread client = new ClientThread();
					client.start();
				}
			});
		}
		return connectButton;
	}
}

http://4programmers.net/Pastebin/890 - Tu jest dostępny cały kod, gdyby ktoś uznał za konieczne odpalić go u siebie.

1

Wszystko w jednym pliku:/ ale przebrnąłem ... i się dziwie-uwaliłeś 650+ linii a nie przetestowałeś sobie działania socketów w programie który mógłby zajać 40 linii.

Twój program działa wybitnie poprawnie - startujesz serwer który czeka na klienta. Po połączeniu serwer przechopdzi w nasłuch . Klient po połączeniu wysyła "test" i serwer odbiera i czeka na dalsze komunikaty od klienta...sam zrobiłeś while'a co jest wręcz intuicyjne. Natomiast nie widzę w ogóle metody która ze strony klienta wysyła na serwer komunikat o narysowanej figurze...po narysowaniu figury zrób write'a do serwera i on to odbierze w tym while'u. Zrealizujesz zadanie wtedy.

Jak rozumiem klientów moze bycwielu ale serwer musi być jeden by to miało sens - dodaj zabezpieczenie przed odpaleniem następnego serwera.

A tak w ogóle to radziłbym zastapić Twój sposób czytania/zapisywania danych po stronie serwera i klienta tym:

indata = new DataInputStream(new BufferedInputStream(client.getInputStream()));
outdata = new DataOutputStream(newBufferedOutputStream(client.getOutputStream()));

Masz wtedy ładne metody writeUTF/readUTF.

0
lipkerson napisał(a)

Wszystko w jednym pliku:/ ale przebrnąłem ... i się dziwie-uwaliłeś 650+ linii a nie przetestowałeś sobie działania socketów w programie który mógłby zajać 40 linii

Stało się tak, bo to program tworzony na bazie mojego poprzedniego programu, który rysował lokalnie.
Fakt, mnie też dobija,że ta klasa się tak rozrosła. Co można zrobić żeby ją podzielić na kilka plików?

lipkerson napisał(a)

Twój program działa wybitnie poprawnie - startujesz serwer który czeka na klienta. Po połączeniu serwer przechodzi w nasłuch . Klient po połączeniu wysyła "test" i serwer odbiera i czeka na dalsze komunikaty od klienta...sam zrobiłeś while'a co jest wręcz intuicyjne. Natomiast nie widzę w ogóle metody która ze strony klienta wysyła na serwer komunikat o narysowanej figurze...po narysowaniu figury zrób write'a do serwera i on to odbierze w tym while'u. Zrealizujesz zadanie wtedy.

Na razie nie ma wysyłania informacji o stworzonej figurze. Na razie jest wysyłanie prostego stringa, jednak serwer odbiera go tylko raz, pomimo umieszczenia w pętli while i nie rozumiem dlaczego.

lipkerson napisał(a)

Jak rozumiem klientów moze bycwielu ale serwer musi być jeden by to miało sens - dodaj zabezpieczenie przed odpaleniem następnego serwera.

Coś jak singleton?

lipkerson napisał(a)

A tak w ogóle to radziłbym zastapić Twój sposób czytania/zapisywania danych po stronie serwera i klienta tym:

indata = new DataInputStream(new BufferedInputStream(client.getInputStream()));
outdata = new DataOutputStream(newBufferedOutputStream(client.getOutputStream()));

Masz wtedy ładne metody writeUTF/readUTF.

Docelowo, to ja planuję w ogóle zserializować klasę figure i w ten sposób ją przesyłać, jednak na razie próbuję w ogóle odpalić to połączenie.

EDIT: Doszedłem dlaczego pojedynczy input wieszał mi serwer. Po prostu nie zamykałem strumienia wejściowego w kliencie i serwer czekał w nieskończoność na dalsze wejście w strumieniu... Głupi błąd :/

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