# Hilfe ich komme bei meinem UDP chat Server nicht mehr weiter



## daggett (27. Nov 2008)

hallo erstmal.

ich habe bei euch verdammt viele posts zu dem thema gefunden aber konnte mir wirklich helfen.
wir müssen für die FH einen Chat von TCP auf UDP umschreiben und ich habe da jetzt irgedwie ein Problem ich kriege meine send methode einfach nicht hin. aber ich weiß auch nicht mehr was ich machen soll.

ich hab mir einfach gedacht ich poste das mal ihr müsst mir aber verzeihen ich bin in der hinsicht ein wirklicher anfänger deshalb werde ich wahrscheinlich verdammt viele Fehler drin haben.
 :roll: 
Vielleicht ist jemand so nett und kann mir erklären was ich falsch gemacht habe bei bedarf poste ich auch noch die zugehörigen dinge noch.

ICH BRAUCHE WIRKLICH EURE HILFE!!!!!!!!


```
import java.net.*;
import java.io.*;

import server.ChatEventManager;
import server.Query;
import server.ChatEvent;

public class udpserver{ 
	protected static DatagramSocket socket;
	private static DatagramSocket serverSocket;
	private static ChatEventManager manager;
	private static Socket incoming;
	
	
	public void Echo (int port) throws IOException
	{
		socket = new DatagramSocket (port);
	}
	
	
	protected static DatagramPacket receive() throws IOException
	{
		byte buffer[] = new byte[65535];
		DatagramPacket packet = new DatagramPacket (buffer, buffer.length);
		socket.receive(packet);
		return packet;
		
	}
	

	 
public static void main(String args[]) {
    try {
       serverSocket = new DatagramSocket(8205);
       System.out.println("ServerCommunicator waiting for clients...");

       manager = new ChatEventManager();

       while (true) {

    	  ServerCommunicator communicator = new ServerCommunicator(incoming);

          // Starten des ServerCommunicator Threads:
          communicator.start();
       }
    } catch (Exception e) {
       e.printStackTrace();
    }
 }

    public void ServerCommunicator(DatagramSocket incoming) {
    this.serverSocket = incoming;

 }

 /**
  * run Methode zum starten des Threads.
  *
  */
 public void run(byte data[], int length) {
    boolean finished = false;

    while (!finished) {

       DatagramPacket packet = new DatagramPacket(data, data.length);

       try {
          serverSocket.receive(packet);
       } catch (IOException e1) {
          // TODO Auto-generated catch block
          e1.printStackTrace();
       }

       try {

             

          // Adresse des Absenders für Antwort ermitteln :
          InetAddress target = packet.getAddress();
          int port = packet.getPort();

          switch (Query.getQuery()) {
          case Query.LOGIN:
             manager.login(Query.getName());
             send(new Query(Query.CONFIRM, null, null), target, port);
             break;
          case Query.MESSAGE:
             manager.tell(Query.getName(), Query.getMessage());
             send(new Query(Query.CONFIRM, null, null), target, port);
             break;
          case Query.LOGOUT:
             manager.logout(Query.getName());
             send(new Query(Query.CONFIRM, null, null), target, port);
             break;
          case Query.POLLING:
             ChatEvent evt = manager.poll(Query.getName());
             if (evt != null && evt.getCommand() == ChatEvent.LOGOUT)
                finished = true;
             send(evt, target, port);

             break;

          }

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

 } // run

 /**
  * Sendet die Antwort an den Client
  *
  * @param object
  *            Das Antwortobjekt
  * @param target
  *            Der Zielhost
  * @param port
  *            Zielport 
  * @throws IOException
  */
 public void send(Object query, InetAddress target, int port )
       throws IOException {

    DatagramPacket sendPacket = new DatagramPacket(query, target,
          port);
    serverSocket.send(sendPacket);

 }

}
```
[/b]


----------



## tuxedo (27. Nov 2008)

Vielleicht sagst du uns erst detailiert woran es scheitert?
So spontan ist da nix falsches zu erkennen ..

- Alex


----------



## daggett (27. Nov 2008)

hmmm ja also bei meinem eclipse merkert er mir das immer rot an und ich hab da keine ahnung warum.
es müsste eigentlich alles stimmen bis auf meine send methode naja hoffe ich.
also die eclipse fehlermeldung ist:"DatgramPacket cannot be resolved to a type"
ich weiß nicht ob dir das was helfen kann


----------



## daggett (27. Nov 2008)

SRY war die falsche Fehlermeldung!
jetzt die richtige:"The constructor DatagramPacket(Object, InetAddress, int) is undefined"
sry nochmal


----------



## HoaX (27. Nov 2008)

es gibt halt keinen konstruktor der die typen annimmt die du da übergibst:
http://java.sun.com/javase/6/docs/api/java/net/DatagramPacket.html

der erste parameter darf nicht "Object" sein


----------



## daggett (28. Nov 2008)

hmmm ich hab jetzt nochmal mit meinem Prof gesprochen und er hat gesagt das man in "DatagramPacket kein objekt reinnehmen darf" stimmt das auch??
und wenn ja kann mir einer irgendeine  andere Idee vorschlagen wie man das machen kann??


----------



## HoaX (29. Nov 2008)

Das Selbe sagte ich doch auch schon. Du übergibst als ersten Parameter eine Variable vom Typ Object was nicht geht, der erste Parameter muss ein byte[] sein.
Schau doch mal im Ursprungsprogramm nach wies da gemacht wurde, über TCP kannst du auch nicht einfach n Object senden...
Ansonsten nimm z.B. einen ObjectOutputStream + ByteArrayOutputStream, mit denen kannst du dein Objekt in ein byte[] umwandeln. Auf der gegenseite dann das Selbe mittels der entsprechenden InputStreams.


----------



## tuxedo (1. Dez 2008)

Allerdings sollte man sich im klaren sein dass UDP Pakete verloren gehen können und nicht unbedingt in der Reihenfolge ankommen in der man sie abgeschickt hat...

D.h. ich würde da die Objektserialisierung und die damit verbundene Fragmentierung der Daten (je nach Größe des Objekts) versuchen zu vermeiden.

- Alex


----------



## HoaX (1. Dez 2008)

da geb ich dir vollkommen recht, aber wenn man sich die reelle lebenserwartung von so einem chat sieht ist dass ehr unter den tisch fallen zu lassen


----------



## tuxedo (1. Dez 2008)

Da hast du jetzt wieder recht ROFL

- Alex


----------

