[java] klient - serwer --> poczatki.. potzrebna mala pomo

0

Witam w ramach nauki programowania sieciowe w Javie chcialem napisac prostego czata do komunikacji dwoch komputerow. Mam dwie proste aplikacje wygladajace podobnie z tym ze jedna udostepnia port i oczekuje na przylaczenie klienta.. druga to klient ktory podaje IP serwera i nr udostepnionego portu..., po palaczeniu w oknie dialogowym serwera pokazuje sie napisz "wszystko ok" informujacy o polaczeniu.

Mam problem z implementacja opcji wymiany pomiedzy informacji.
Ze wzgledu ze jestem poczatkujacy w tym temacie prosze o wyrozumialosc i pomoc :-)

Wklejam kod aplikacji serwera i klienta:

Serwer:

import javax.swing.JFrame;

public class ChatSerwer {

public static void main (String[] args)
{
	ChatSerwerFrame frame = new ChatSerwerFrame();
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setVisible(true);
	
}

}
//-----------------------------------------------------------------------------------------------------------------------

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

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

public class ChatSerwerFrame extends JFrame
{
public ChatSerwerFrame()
{
setSize(500,500);
setTitle("Server");

	panel = new JPanel();
	panel.setLayout(null);
	
	label_port = new JLabel("Port :");
	label_port.setBounds(10, 10, 50, 25);
	panel.add(label_port);
	
	text_port = new JTextField(15);
	text_port.setBounds(60, 10, 110, 25);
	text_port.setText("8189");
	panel.add(text_port);
	
	button_port = new JButton("Set");
	button_port.setBounds(200, 10, 60, 25);
	button_port.addActionListener(new ActionListener()
	{

		public void actionPerformed(ActionEvent event) 
		{
			
			port = Integer.parseInt(text_port.getText());
			text_port.setEditable(false);
			
		}
		
	});
	panel.add(button_port);
	
	
	
	label_message = new JLabel("Text:");
	label_message.setBounds(10, 410, 50, 25);
	panel.add(label_message);
	
	text_message = new JTextField(15);
	text_message.setBounds(40, 410, 330, 25);
	panel.add(text_message);
	
	
	
	button_message = new JButton("Send");
	button_message.setBounds(400, 410, 70, 25);
	panel.add(button_message);
	button_message.addActionListener(new ActionListener()
	{

		
		public void actionPerformed(ActionEvent event) 
		{
			try 
			{
					
				
					
				/*
				 * utworzenie gniazda Servera i oczekiwanie na połączonie.
				 */
				ServerSocket ss = new ServerSocket(port);
				Socket incoming = ss.accept();
				
				try
				{
					
					textArea.setText("Wszystko OK");
					
					InputStream inStream = incoming.getInputStream();
					OutputStream outStream = incoming.getOutputStream();
					
					Scanner in = new Scanner(inStream);
					PrintWriter out = new PrintWriter(outStream,true);
		            
					String line = text_message.getText();

					textArea.setText(textArea.getText() + "\n" + line);
					out.print("Wszystko OK");
		
		
		               
		               
		               
		          
				
				}
				finally
				{
					incoming.close();
				}
				

			} 
			catch (IOException e) 
			{
				e.printStackTrace();
			}
			
			
		}
		
	});
	
	textArea = new JTextArea(200,200);
	
	
	JScrollPane scroll = new JScrollPane(textArea);
	scroll.setBounds(10, 43, 450, 350);
	panel.add(scroll);
	
	
	add(panel);
	
	
	
	
	
	
	
}




private JPanel panel;
private JTextArea textArea;
private JButton button_message;
private JButton button_port;
private JLabel label_message;
private JLabel label_port;
private JTextField text_message;
private JTextField text_port;
private JScrollPane scroll;
private int port;

}

Klient:

import javax.swing.JFrame;

public class Chat {

public static void main (String[] args)
{
	ChatFrame frame = new ChatFrame();
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setVisible(true);
	
}

}

//**********************************************************************************

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

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

public class ChatFrame extends JFrame
{
public ChatFrame()
{
setSize(500,500);
setTitle("Klient");

	panel = new JPanel();
	panel.setLayout(null);
	
	label_ip = new JLabel("IP serwera :");
	label_ip.setBounds(10, 10, 70, 25);
	panel.add(label_ip);
	
	text_ip = new JTextField(15);
	text_ip.setBounds(90, 10, 110, 25);
	text_ip.setText("127.0.0.1");
	panel.add(text_ip);
	
	button_ip = new JButton("Set");
	button_ip.setBounds(210, 10, 60, 25);
	button_ip.addActionListener(new ActionListener()
	{

		public void actionPerformed(ActionEvent event) 
		{
			
			server_ip = text_ip.getText();
			
			
			
		}
		
	});
	
	panel.add(button_ip);
	
	
	label_message = new JLabel("Text:");
	label_message.setBounds(10, 410, 50, 25);
	panel.add(label_message);
	
	text_message = new JTextField(15);
	text_message.setBounds(40, 410, 330, 25);
	panel.add(text_message);
	
	button_message = new JButton("Send");
	button_message.setBounds(400, 410, 70, 25);
	panel.add(button_message);
	button_message.addActionListener(new ActionListener()
	{

		
		public void actionPerformed(ActionEvent event) 
		{
			try 
			{
				Socket s = new Socket(server_ip,8189);
				try
				{
					InputStream inStream = s.getInputStream();
				
					
					Scanner in = new Scanner(inStream);
					
					
					String line = text_message.getText();
					textArea.setText(textArea.getText() + "\n" + line);

					
					
				}
				finally
				{
					s.close();
				}
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
		
	});
	
	textArea = new JTextArea(200,200);
	
	
	JScrollPane scroll = new JScrollPane(textArea);
	scroll.setBounds(10, 43, 450, 350);
	panel.add(scroll);
	
	
	add(panel);
	
	
	
	
	
}




private JPanel panel;
private JTextArea textArea;
private JButton button_message;
private JButton button_ip;
private JLabel label_message;
private JLabel label_ip;
private JTextField text_message;
private JTextField text_ip;
private JScrollPane scroll;
String server_ip;

}

aby nawiazac polaczenie:

opalamy program serwera klikamy Set potem na dole Send

nastepnie odpalamy program klienta i klitamy rowniez Set, Send

problem jest w tym aby komunikaty wpisywanie w polu text pojawiamy sie obu konsolkach programu u klienta i na serwerze :)

0

Musisz stworzyć oddzielny wątek na serwerze, który będzie nasłuchiwał.

Zrobienie
ServerSocket ss = new ServerSocket(port);
Socket incoming = ss.accept();
w wątku odpowiedzialnym za rysowanie to bardzo zły pomysł.

Poza tym
ServerSocket ss = new ServerSocket(port);
powinien być wykonany tylko jeden raz. Natomiast accept() wielokrotnie.

Zacznij od prostszej sytuacji, gdzie komunikacji jest od klienta do serwera.

Serwer powinien wyglądać mniej więcej tak:

ServerSocket ss = new ServerSocket(port); /* To musi byc wykonane tylko raz */
Socket incoming = ss.accept();

try
{                        
        InputStream inStream = incoming.getInputStream();
    
        BufferedReader in = new BufferedReader(new InputStreamReader(inStream));
        String line = in.readLine();
   
        textArea.setText(textArea.getText() + "\n" + line);
}
finally
{
        incoming.close();
}

A klient:

Socket s = new Socket(server_ip,8189);
try
{
    OutputStream outputStream = s.getOutputStream();
    Writer writer = new BufferedWriter(new OutputStreamWriter(outputStream));
    String line = text_message.getText();
    textArea.setText(textArea.getText() + "\n" + line);
    writer.append(line);
    writer.close();                                               
}
finally
{
    s.close();
}
0

Dzieki wielkie jutro sobie to obczaje na spokojnie :) Jeszcze raz dzieki za podpowiedz :)

0

Wszystko działa fajnie tylko ze to klient wysyła info do serwera, ten ja odbiera...
Niewiem czy dobrze mysle, ale skoro Strumien Wyjsciowy Klienta jest strumieniem Wejsciowego Serwera, to aby wyslac info do klienta od serwera to nalezy zdefiniowac stumien wyjsciowy serwera ktory bedzie wejsciowym klienta [???]

0

Dokladnie tak jak mowisz.

0

jeszcze jedna mam prsbe o podpowiedz jak ma wygladac koncepcja wymiany informacji, chodzi mi o to jak to zrobic aby w momencie wyslania informacji przez klienta w konsolce serwera sie to o razu pojawialo i odwrotnie. Wrzucam kodzik aplikacji serwera i klienta ale jest tam tylko mozliwe wyslanie informacji do serwera albo jesli sie w komentarze wezme definicje strumieni w sposob " na odwrot niz jest to w kodzie" to wtedy wyslanie jednorazowej informacji do klienta.

SERWER


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

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

import javax.swing.JFrame;


public class ChatServer {
	public static void main (String[] args)
	{
		ChatServerFrame frame = new ChatServerFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);		
	}
}
class ChatServerFrame extends JFrame
{
	public ChatServerFrame()
	{
		setSize(500,500);
		setTitle("Server");
		
		panel = new JPanel();
		panel.setLayout(null);
		
		label_expect = new JLabel("Bezczynny");
		label_expect.setBounds(10, 10, 100, 25);
		panel.add(label_expect);
		
		
		button_port = new JButton("Send Request");
		button_port.setBounds(100, 10, 150, 25);
		button_port.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent event) 
			{				
				button_port.setEnabled(false);
				label_expect.setText("Oczekiwanie...");
				
				/*
				 * Koniecznie tylko jednorazowe utworzenie 
				 * portu Servera
				 */
				try 
				{
					ss = new ServerSocket(8189);
				} 
				catch (IOException e) 
				{					
					e.printStackTrace();
				} 				
			}			
		});
		panel.add(button_port);
		
		
		text_name = new JTextField(20);
		text_name.setBounds(280, 10, 80, 25);
		panel.add(text_name);
		
		button_name = new JButton("Set Name");
		button_name.setBounds(370, 10, 100, 25);
		panel.add(button_name);
		
		button_name.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent event)
			{
				name = text_name.getText();
				text_name.setEditable(false);
				button_name.setEnabled(false);
			}
		});
			
		label_message = new JLabel("Text:");
		label_message.setBounds(10, 410, 50, 25);
		panel.add(label_message);
		
		text_message = new JTextField(15);
		text_message.setBounds(40, 410, 330, 25);
		panel.add(text_message);
			
		button_message = new JButton("Send");
		button_message.setBounds(400, 410, 70, 25);
		panel.add(button_message);
		button_message.addActionListener(new ActionListener()
		{

			
			public void actionPerformed(ActionEvent event) 
			{
				try 
				{	
					/*
					 * oczekiwanie na połączonie do portu servera.
					 */					
					Socket incoming = ss.accept();
					label_expect.setText("Polączono...");
					textArea.setText("Wszystko OK");
						
						try
						{   
							/*
							InputStream inStream = incoming.getInputStream();
					        BufferedReader in = new BufferedReader(new InputStreamReader(inStream));
					        String line = in.readLine();
					        textArea.setText(textArea.getText() + "\n" + line);     
							*/
					        
							OutputStream outputStream = incoming.getOutputStream();
						    Writer writer = new BufferedWriter(new OutputStreamWriter(outputStream));
						    String klientline = text_message.getText();
						    textArea.setText(textArea.getText() + "\n" + name + "> " + klientline);
						    writer.append(name + "> " + klientline);
						    writer.close();
							
						}
						finally
						{
						        incoming.close();
						}
				} 
				catch (IOException e) 
				{
					e.printStackTrace();
				}	
			}			
		});
		
		textArea = new JTextArea(200,200);
				
		JScrollPane scroll = new JScrollPane(textArea);
		scroll.setBounds(10, 43, 450, 350);
		panel.add(scroll);
				
		add(panel);	
	}
	
	private JPanel panel;
	private JTextArea textArea;
	private JButton button_message;
	private JButton button_port;
	private JLabel label_message;
	private JLabel label_expect;
	private JTextField text_message;
	private JTextField text_name;
	private JButton button_name;
	private String name;
	private JScrollPane scroll;
	private ServerSocket ss;
	
}

KLIENT

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

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

import javax.swing.JFrame;


public class ChatKlient {
	public static void main (String[] args)
	{
		ChatKlientFrame frame = new ChatKlientFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);		
	}
}

class ChatKlientFrame extends JFrame
{
	public ChatKlientFrame()
	{
		setSize(500,500);
		setTitle("Klient");
		
		panel = new JPanel();
		panel.setLayout(null);
		
		label_ip = new JLabel("IP serwera :");
		label_ip.setBounds(10, 10, 70, 25);
		panel.add(label_ip);
		
		text_ip = new JTextField(15);
		text_ip.setBounds(90, 10, 110, 25);
		text_ip.setText("127.0.0.1");
		panel.add(text_ip);
		
		button_ip = new JButton("Set");
		button_ip.setBounds(210, 10, 60, 25);
		button_ip.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent event) 
			{			
				server_ip = text_ip.getText();
				text_ip.setEditable(false);
				button_ip.setEnabled(false);
				/*
				 * Podłączenie do serwera o o IP 127.0.0.1 i portcie 8189
				 */
				try 
				{
					s = new Socket(server_ip,8189);
				} 
				catch (UnknownHostException e) 
				{
					e.printStackTrace();
				} 
				catch (IOException e) 
				{
					e.printStackTrace();
				}				
			}		
		});
		
		panel.add(button_ip);
		
		text_name = new JTextField(20);
		text_name.setBounds(280, 10, 80, 25);
		panel.add(text_name);
		
		button_name = new JButton("Set Name");
		button_name.setBounds(370, 10, 100, 25);
		panel.add(button_name);
		
		button_name.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent event)
			{
				name = text_name.getText();
				text_name.setEditable(false);
				button_name.setEnabled(false);
			}
		});
			
		label_message = new JLabel("Text:");
		label_message.setBounds(10, 410, 50, 25);
		panel.add(label_message);
		
		text_message = new JTextField(15);
		text_message.setBounds(40, 410, 330, 25);
		panel.add(text_message);
		
		button_message = new JButton("Send");
		button_message.setBounds(400, 410, 70, 25);
		panel.add(button_message);
		button_message.addActionListener(new ActionListener()
		{			
			public void actionPerformed(ActionEvent event) 
			{
				try 
				{
					try
					{
						/*
					    OutputStream outputStream = s.getOutputStream();
					    Writer writer = new BufferedWriter(new OutputStreamWriter(outputStream));
					    String line = text_message.getText();
					    textArea.setText(textArea.getText() + "\n" + name + "> " + line);
					    writer.append(name + "> " + line);
					    writer.close(); 	 
						*/
						InputStream inStream = s.getInputStream();
				        BufferedReader in = new BufferedReader(new InputStreamReader(inStream));
				        String serverline = in.readLine();
				        textArea.setText(textArea.getText() + "\n" + serverline);
				        
					}
					finally
					{
					    s.close();
					}					
				} 
				catch (UnknownHostException e) 
				{
					e.printStackTrace();
				} 
				catch (IOException e) 
				{
					e.printStackTrace();
				}				
			}			
		});
		
		textArea = new JTextArea(200,200);
				
		JScrollPane scroll = new JScrollPane(textArea);
		scroll.setBounds(10, 43, 450, 350);
		panel.add(scroll);
				
		add(panel);		
	}
	
	private JPanel panel;
	private JTextArea textArea;
	private JButton button_message;
	private JButton button_ip;
	private JLabel label_message;
	private JLabel label_ip;
	private JTextField text_message;
	private JTextField text_ip;
	private JTextField text_name;
	private JButton button_name;
	private String name;
	private JScrollPane scroll;
	private String server_ip;
	private Socket s;	
}

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