[Java] Prosty czat

Witam.

Poniżej przedstawiam kod klienta i serwera prostego czatu.

Serwer:

import java.net.*;

import java.io.*;

import java.util.*;


public class CzatSerwer{

	ArrayList strumienieWyjsciowe;

	ObjectInputStream wej;


	public class ObslugaKlientow implements Runnable{

		BufferedReader czytelnik;

		Socket gniazdo;


		public ObslugaKlientow(Socket clientSocket){

			try{

				gniazdo = clientSocket;

				wej = new ObjectInputStream(gniazdo.getInputStream());

			}

			catch(Exception ex){

				ex.printStackTrace();

			}

		}


		public void run(){

			String wiadom;

			Object o1 = null;

			Object o2 = null;

			try{

				while((o1 = wej.readObject()) != null){	

					o2 = wej.readObject();

					System.out.print("Odczytano obiekty");

					rozesliDoWszystkich(o1,o2);

				}

			}

			catch(Exception ex){

				ex.printStackTrace();

			}

		}

	}


	public static void main(String[] args){

		new CzatSerwer().doRoboty();

	}


	public void doRoboty(){

		strumienieWyjsciowe = new ArrayList();

		try{

			ServerSocket serverSock = new ServerSocket(5000);

			while(true){

				Socket gniazdoKlienta = serverSock.accept();

				ObjectOutputStream wyj = new ObjectOutputStream(gniazdoKlienta.getOutputStream());

				strumienieWyjsciowe.add(wyj);


				Thread t = new Thread(new ObslugaKlientow(gniazdoKlienta));

				t.start();


				System.out.println("Mamy połączenie");

			}

		}

		catch(Exception ex){

			ex.printStackTrace();

		}

	}


	public void rozesliDoWszystkich(Object o1, Object o2){

		Iterator it = strumienieWyjsciowe.iterator();

		while(it.hasNext()){

			try{

				ObjectOutputStream wyj = (ObjectOutputStream) it.next();

				wyj.writeObject(o1);

				wyj.writeObject(o2);

				System.out.println("Wysłano obiekty");

			}

			catch(Exception ex){

				ex.printStackTrace();

			}

		}

	}

}

Klient:

import java.io.*;

import java.net.*;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;


public class CzatKlient{

	JTextArea odebraneWiadomosci;

	JTextField wiadomosc;

	BufferedReader czytelnik;

	PrintWriter pisarz;

	Socket gniazdo;


	ObjectInputStream wej;

    ObjectOutputStream wyj;


	String NICK;


	public static void main(String[] args){

		CzatKlient klient = new CzatKlient();

		klient.doDziela(args[0]);

	}


	public void doDziela(String nick){

		NICK = nick;

		JFrame ramka = new JFrame("Klient pogawedek");

		JPanel panelGlowny = new JPanel();


		odebraneWiadomosci = new JTextArea(15,50);

		odebraneWiadomosci.setLineWrap(true);

		odebraneWiadomosci.setWrapStyleWord(true);

		odebraneWiadomosci.setEditable(false);


		JScrollPane przewijanie = new JScrollPane(odebraneWiadomosci);

		przewijanie.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

		przewijanie.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);


		wiadomosc = new JTextField(20);


		JButton przyciskWysli = new JButton("Wyśli");

		przyciskWysli.addActionListener(new PrzyciskWysliListiner());


		panelGlowny.add(przewijanie);

		panelGlowny.add(wiadomosc);

		panelGlowny.add(przyciskWysli);


		konfigurujKomunikacje();


		Thread watekOdbiorcy = new Thread(new OdbiorcaKomunikatow());

		watekOdbiorcy.start();


		ramka.getContentPane().add(BorderLayout.CENTER, panelGlowny);

		ramka.setSize(600,500);

		ramka.setVisible(true);

	}


	private void konfigurujKomunikacje(){

		try{

			gniazdo = new Socket("127.0.0.1", 5000);


			wyj = new ObjectOutputStream(gniazdo.getOutputStream());

			wej = new ObjectInputStream(gniazdo.getInputStream());

			System.out.println("Obsługa sieci przygotowana");

		}

		catch(IOException ex){

			ex.printStackTrace();

		}

	}


	public class PrzyciskWysliListiner implements ActionListener{

		public void actionPerformed(ActionEvent ev){

			try{

				wyj.writeObject(wiadomosc.getText());

				wyj.writeObject(NICK);

			}

			catch(Exception ex){

				ex.printStackTrace();

			}

			wiadomosc.setText("");

			wiadomosc.requestFocus();

		}

	}


	public class OdbiorcaKomunikatow implements Runnable{

		public void run(){

			String wiado;

			Object o1 = null;


			try{

				while((o1 = wej.readObject()) != null){

					String wiadom = (String) o1;

					String nick = (String) wej.readObject();

					odebraneWiadomosci.append(nick +" "+ wiadom + "\n");

				}

			}

			catch(Exception ex){

				ex.printStackTrace();

			}

		}

	}

}

Testując czat na własnym komputerze napotkałem problem. Pracuje w wierszu poleceń i oczywiście serwer i klienta odpalam w odzielnycj okanch cmd. Gdy otwieram jednego klienta, wszystko działa dobrze, serwer otrzymuje wiadomość i wysyła. Gdy uruchamiam dwóch klientów jest kłopot. Gdy wysyłam wiadomość z klienta odpalonego jako drugi, wszystko działa, serwer rozsyła wiadomośći do wszystkich. Jednak gdy próbuje wysłać wiadomość z klienta odpalonego jako pierwszy nic się nie dzieje, serwer nie otrzymuje obiektów. Gdy po tej próbie wracam do drugiego klienta i próbuje wysłać coś dostaje na serwerze dwa wyjątki “StreamCorruptException”

java.io.StreamCorruptedException: invalid type code: 00

        at java.io.ObjectInputStream.readObject0(Unknown Source)

        at java.io.ObjectInputStream.readObject(Unknown Source)

        at CzatSerwer$ObslugaKlientow.run(CzatSerwer.java:37)

        at java.lang.Thread.run(Unknown Source)

java.io.StreamCorruptedException: invalid type code: 00

        at java.io.ObjectInputStream.readObject0(Unknown Source)

        at java.io.ObjectInputStream.readObject(Unknown Source)

        at CzatSerwer$ObslugaKlientow.run(CzatSerwer.java:32)

        at java.lang.Thread.run(Unknown Source)

O co może chodzić ?

Pozdrawiam :slight_smile:

Dodane 29.10.2012 (Pn) 10:54

Problem pojawia się gdy próbuje przesłać dwa obiekty.

Gdy przesłyałm jeden, wszystko działa dobrze.

Pomoże ktoś?:slight_smile: