Sockety - początki

0

Witam - mam problem z sockietami. Robię prosty chat w cmd, lecz mam problem. Wysyłam poprawnie do serwera dane i je odbieram, po czym zwracam do klienta, lecz serwer nie rozsyła to innych klientów tej wiadomości, tylko do tego clienta który go napisał ;/. Jestem w socketach początkujący, zaczynam z nimi zabawę. Oto kod :

Serwer:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class Server
{
	public static final int port = 9999;
	
		public static void main(String[] args) throws IOException
		{
			new Server().run();
		}
	
		public void run() throws IOException
		{
			ServerSocket Serversocket = new ServerSocket(port);
			System.out.println("Serwer nasluchuje portu :"+port);
			while(true)
			{
			Socket socket = Serversocket.accept();
			new ServerThread(socket).start();
			}
		}

}
 

Serwer Thread:

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


public class ServerThread extends Thread{
	Socket socket;
	ServerThread(Socket socket)
	{
		this.socket = socket;
	}

	public void run()
	{
		try 
		{
			BufferedReader bufferedRender = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
			String message = null;
			System.out.println("User ->"+bufferedRender.readLine()+" polaczyl sie !");
			while((message = bufferedRender.readLine()) !=null)
			{
				System.out.println("IN > "+message);
				printWriter.println("From Client:"+message);

			}
			socket.close();
		}
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}
}

Client:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {
	
	public static void main(String[] args) throws UnknownHostException, IOException
	{
	
		String name = args[0];
		Socket socket = new Socket("localhost",9999);
		BufferedReader bufferedReaderFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
		printWriter.println(name);
		BufferedReader bufferedReaderFromCommandPrompt = new BufferedReader(new InputStreamReader(System.in));
		
		while(true)
		{
			String readerInput = bufferedReaderFromCommandPrompt.readLine();
			printWriter.println(name+":"+readerInput);
			System.out.println(bufferedReaderFromClient.readLine());

		}
		
		
	}
}
 
0

Hint: wykonaj
printWriter.println("From Client:"+message);
na wszystkich obiektach klasy ServerThread. Zadeklaruj jakąś tablicę w klasie Client, utwórz publiczną metodę, której będzie przekazywał message, a ta z kolei w pętli wyśle wiadomości do wszystkich obiektów z tablicy.

0

Mógłbyś mi to jakoś bardziej objaśnić ;/

0

np tak:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
 
 
public class Server
{
	public static final int port = 9999;
        private ServerThread[] serverThread = new ServerThread[100];
 
	public static void main(String[] args) throws IOException
	{
		new Server().run();
	}

	public synchronized void broadcastMessage( String message ) {
		
		try {
			for ( int n = 0; n < serverThread.lenght; n++ ) {
				if ( serverThread[n] != null ) {
					serverThread[n].printWriter.println("From Client:"+message);
				}
			}
		}
		catch ( Exception ignored ) { }
	}
 
	public void run() throws IOException
	{
		ServerSocket Serversocket = new ServerSocket(port);
		System.out.println("Serwer nasluchuje portu :"+port);
		while(true)
		{
			Socket socket = Serversocket.accept();
			//new ServerThread(socket).start();
			for ( int n = 0; n < serverThread.lenght; n++ ) {
				if ( serverThread[n] == null ) {
					( serverThread[n] = new ServerThread( socket, this ) ).start();
                                        break;
				}
			}
		}
	}
 
}


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
 
 
public class ServerThread extends Thread{
        Socket socket;
	private Server server;
        public PrintWriter printWriter;
        ServerThread(Socket socket, Server server)
        {
                this.socket = socket;
		this.server = server;
        }
 
        public void run()
        {
                try 
                {
                        BufferedReader bufferedRender = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        printWriter = new PrintWriter(socket.getOutputStream(),true);
                        String message = null;
                        System.out.println("User ->"+bufferedRender.readLine()+" polaczyl sie !");
                        while((message = bufferedRender.readLine()) !=null)
                        {
                                System.out.println("IN > "+message);
                                //printWriter.println("From Client:"+message);
				this.server.broadcastMessage( message );
 
                        }
                        socket.close();			
                }
                catch (IOException e) 
                {
                        e.printStackTrace();
                }
		this = null;
        }
}
0

Możesz mi objaśnić jak działa metoda synchronized ?

0

Na danym obiekcie może w jednej chwili być wywoływana tylko jedna metoda synchronizowana. Więc nawet jeśli n-wątków próbuje wywoływać metody synchronizowane na obiekcie X to w tylko jeden może to zrobić a reszta musi czekać aż metoda się zakończy i dopiero następny będzie mógł zacząć wykonywanie metody.

0

Ok, sory, ale jakoś nie rozumiem, tego co mi tam dodałeś w kodzie ;/ Wyświetla mi errory.

0

No to napisz z łaski swojej jakie to errory. Pisałem to z palca, chciałem Ci pokazać jak to mniej więcej powinno wyglądać.

0

Serwer:

                    for ( int n = 0; n < serverThread.lenght; n++ ) 
                                     Oraz
                    for ( int n = 0; n < serverThread.lenght; n++ ) 

w Serwer Thread

this = null;

0

@Edit
Mógłbyś mi również objaśnić to co dodałeś, po linijce, bo jakoś tego nie rozumiem. Sory, ale to moje pierwsze zetknięcie z socketami, wcześniej jave używałem tylko do pisania pluginów pod bukkita.

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