Archief - JAVA chat programma

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Lefky

Legacy Member
ik zoek naar een mooi voorbeeld met multicast

dit lukt bv al niet
Code:
        private MulticastSocket socket;
	private ExecutorService threadPool = Executors.newFixedThreadPool(10);

	public Server(MulticastSocket socket) {
		this.socket = socket;
	}

	public void run() {

		MulticastSocket link = null;

		try {

			do {
				[U][B]link = socket.accept();[/B][/U]
                 
                                .........
die accept dan
als er iemand kan helpen, graag :)

Fraggie

Legacy Member
Waarom heb je een multicast nodig?
Indien je naar meerdere users hetzelfde bericht wil sturen, moet dat niet via een multicast.

Lefky

Legacy Member
wel ik heb intussen iets gevonden dat een hashmap van de sockets en hun output bijhoud
zo dan? :)

Kemblin

Legacy Member
weet dat multicast meestal op basis van UDP werkt en je daardoor met packet loss te maken kan hebben. Volgens mij wil je eerder een TCP connectie opzetten.

soit om toch op je vraag te antwoorden:
Code:
MulticastSocket s = new MulticastSocket(34989);
s.joinGroup(InetAddress.getByName("225.4.5.6"));

zo maak je een multicast socket die je met een bepaalde group met ip 225.4.5.6 en poort 34989 laat werken.

Code:
byte buf[] = new byte[1024];
		    
// Create a DatagramPacket (udp)
DatagramPacket pack = new DatagramPacket(buf, buf.length, InetAddress.getByName("225.4.5.6"), 34989);
		    
s.send(pack);

zo verzend je een multicast udp pakketje.

Code:
byte buf[] = new byte[1024];
DatagramPacket pack = new DatagramPacket(buf, buf.length);
	    
s.setSoTimeout(0);
s.receive(pack);
	    
//System.out.println("Received data from: " + pack.getAddress().toString() + ":" + pack.getPort() + " with length: " + pack.getLength());
	    
String result = new String(pack.getData());

Zo luister je naar en ontvang je een udp multicast pakket. Let op dat "s.receive(pack);" een blocking call is; dwz dat we zo lang blijven wachten op een nieuw pakketje tot de timeout afloopt of je een pakketje ontvangt. In dit vb is de timeout op 0 gezet (= oneindig lang wachten).

Lefky

Legacy Member
zo do ik het nu
Code:
package MulticastServer;

import java.net.*;
import java.io.*;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server {

	private ExecutorService threadPool = Executors.newFixedThreadPool(10);

	private Map<Socket, PrintWriter> clients = new HashMap<Socket, PrintWriter>();

	public Server(int port) {
		listen(port);
	}

	/*
	 * het gewone luisteren op een poort en als er een client verbinding maakt
	 * deze aan de map met clients toevoegen
	 */
	private void listen(int port) {

		ServerSocket serverSocket = null;
		Socket socket = null;

		try {

			serverSocket = new ServerSocket(port);
			System.out.println("Server started");

			while (true) {
				socket = serverSocket.accept();
				System.out.println("Connected " + socket.toString());

				PrintWriter out = new PrintWriter(socket.getOutputStream(),
						true);

				clients.put(socket, out);

				threadPool.execute(new ChatThread(this, socket));
			}

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

	/*
	 * met behulp van de map met clients naar alle clients het bericht sturen
	 * dmv een iterator
	 */
	public void sendToAll(String message, Socket currentSocket) {
		synchronized (clients) {

			Set<Socket> socketSet = clients.keySet();
			Iterator<Socket> iterator = socketSet.iterator();

			while (iterator.hasNext()) {

				Socket soc = iterator.next();

				if (soc != currentSocket) {
					PrintWriter out = clients.get(soc);
					out.println(message);
				}
			}
		}
	}

	/*
	 * als een clients afsluit moet deze terug uit de map verwijders worden en
	 * de connectie gesloten
	 */
	public void removeConnection(Socket soc) {
		synchronized (clients) {

			clients.remove(soc);
			System.out.println("removed " + soc);

			try {
				soc.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Kemblin

Legacy Member
Dat is geen multicast. Nu maak je gebruik van een gewone TCP socket en houdt je een lijst bij van connecties in je server. Het principe van multicast is; je verstuurt iets naar een groep (ip + port) en iedereen die op die groep luistert, ontvangt hetgene je verstuurde zonder dat je ergens een lijst van ip's moet bijhouden. In ieder geval de manier waarop je nu werkt is wel juister voor een chat client dan mbv multicast.

Lefky

Legacy Member
Kemblin zei:
Dat is geen multicast. Nu maak je gebruik van een gewone TCP socket en houdt je een lijst bij van connecties in je server. Het principe van multicast is; je verstuurt iets naar een groep (ip + port) en iedereen die op die groep luistert, ontvangt hetgene je verstuurde zonder dat je ergens een lijst van ip's moet bijhouden. In ieder geval de manier waarop je nu werkt is wel juister voor een chat client dan mbv multicast.

Da multicast was gwn het eerste da in mij opkwam bij 'berichten naar een hele groep'

Lefky

Legacy Member
ok ik heb alles werkende gekregen zelfs met gui enal
maar nu werkt het niet wanneer ik vanop een andere pc wil connectie maken

iemand een idee waaraan dit kan liggen?

Lefky

Legacy Member
nog een kleinigheid
op een lokaal netwerk krijg ik een IOException
globaal krijg ik gwn niks :s

blackrabbit

Legacy Member
killerk1ng zei:
ok ik heb alles werkende gekregen zelfs met gui enal
maar nu werkt het niet wanneer ik vanop een andere pc wil connectie maken

iemand een idee waaraan dit kan liggen?

Eerste idee: firewall?
killerk1ng zei:
nog een kleinigheid
op een lokaal netwerk krijg ik een IOException
globaal krijg ik gwn niks :s

Maar als ik dit lees: gewoon een bug dus. Je kan maw nooit een connectie maken?

Lefky

Legacy Member
blackrabbit zei:
Eerste idee: firewall?


Maar als ik dit lees: gewoon een bug dus. Je kan maw nooit een connectie maken?

Als ik alles op mijn eigen pc draai werkt het wel hoor...
Dus denk nie echt dat het een bug is
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan