java program sieciowy nie odbiera danych

0

Witam!!!
Jestem tu nowy i mam mały problemik mam nadzieje że pomożecie. Problem polega na tym, że klient wysyła wiadomość a serwer jej nie odczytuje. Wiem że cos nie tak jest jak trafia na linie if(inn.hasNextLine()) . Dziękuje za odpowiedzi.

kod zrodlowy glowny

public class JavaStatki2 {
public static void main(String[] args) {
		Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				try {
					serwer start = new serwer();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		t.start();
	Thread tt = new Thread(new Runnable() {
		@Override
		public void run() {
			// TODO Auto-generated method stub
			glowna g = new glowna();
			g.setVisible(true);	
		}
	});
	tt.start();
	
}
}
 

kod zrodlowy klienta

public class glowna extends JFrame {
	JPanel panel = new JPanel();
	JTextArea area = new JTextArea("area", 20, 10);
	JTextField tekst = new JTextField();
	JButton reset = new JButton("Reset");
	JButton wyslij = new JButton("Wyslij");
	Socket s;
	InputStream in;
	OutputStream ou;
	PrintWriter out;
	Scanner inn;

	glowna() {
		try {
			s = new Socket("localhost", 8187);
			if (s.isConnected()) {
				in = s.getInputStream();
				inn = new Scanner(in);
				ou = s.getOutputStream();
				out = new PrintWriter(ou);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("Nie mozna sie polaczyc");
			e.printStackTrace();
		}

		panel.add(reset);
		panel.add(wyslij);
		add(area, BorderLayout.NORTH);
		add(tekst, BorderLayout.CENTER);
		add(panel, BorderLayout.SOUTH);
		reset.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				tekst.setText("");
				area.setText("");
			}
		});

		wyslij.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
			out.print(tekst.getText());
			}
		});

		Thread odbierz = new Thread(new Runnable() {

			@Override
			public void run() {
				
				while(true) {
				String odebranyTekst = inn.nextLine();
				area.append(odebranyTekst+"\n");
			}}
		});
		odbierz.start();

	}

}
 

kod zrodlowy serwera

 
public class serwer  {

	serwer() throws IOException {
		
		ServerSocket soket = new ServerSocket(8187);
		System.out.print("Server dziala");
		while(true) {
			Socket s=soket.accept();
			System.out.println("Spawning");
			Runnable r = new Server2(s);
			Thread t =new Thread(r);
			t.start();
		}
	}
}


class Server2 implements Runnable {
	private Socket incoming;
	InputStream in;
	OutputStream ou;
	Scanner inn;
	PrintWriter out;
	
	public Server2(Socket i) {
		incoming=i;
	}
	public void run() {
		try {
		try {
			 in = incoming.getInputStream();
			 ou = incoming.getOutputStream();
			
			 inn = new Scanner(in);
			 out = new PrintWriter(ou, true /* autoFlash*/);
			
			out.println("Wpisz By aby wyjsc");
			boolean done = false;
			while(!done) {
				if(inn.hasNextLine()) {
				String line = inn.nextLine();
				System.out.println("Serwer: " + line);
				out.println("Serwer: "+line); 
				if(line.trim().equals("By")) done=true; }
		}
		}
		finally {
			System.out.println("Close");
			incoming.close();
		}
	}
		catch (IOException e) {
			System.out.println("Blad w try");
			e.printStackTrace();
		}
	}
	
}
0

String line = inn.nextLine(); oczekuje na znak końca linii a klient wysyła out.print(tekst.getText());' czyli bez znaku końca linii. Jeżeli nie jest on zawarty na końcu Stringa, który wysyłasz to Scanner na serwerze będzie wisiał tak długo, aż go dostanie. Spróbuj zamienić na out.println(tekst.getText()); i daj znać czy działa.

0

Zmieniłem ale niestety dalej zatrzymuje się w tym samym miejscu :/

0

Po out.println() dodaj out.flush()

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