Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Pir0x am 11.09.08 - 12:33:21

Titel: Java Agent für UDP
Beitrag von: Pir0x am 11.09.08 - 12:33:21
Hallo, ich wollte einen Java Agent programmieren basiernd auf UDP, allerdings bin ich mir Java Syntax dafür nicht so sicher, ich hab ein Bespiel gefunden:

Link: http://andreas-rozek.de/Java/JavaKurs/Vortrag/sld155.htm

bei mir sieht das dann folgendermaßen aus:

Code
	try 
			{
			DatagramSocket UDPSocket = new DatagramSocket(int 1024, InetAdress 192.168.72.114);
			DatagramPacket UDPPacket = new DatagramPacket();
			
			UDPPacket.setData(41);
			UDPPacket.setLength(1);
			
			UDPSocket.send(UDPPacket);
			UDPSocket.receive(UDPPacket);
			
			UDPSocket.close();
			
			} catch (SocketException Signal) {
			} catch (IOException Signal) {
			};

meine Frage ist ob das so funktioniert oder muss ich da noch was mit einbauen?
Titel: Re: Java Agent für UDP
Beitrag von: Ralf_M_Petter am 11.09.08 - 13:51:39
Den Code halte ich für etwas fragwürdig, da er sich nicht an die Javakonventionen hält, aber prinzipiell halte ich Ihn für richtig, auch wenn du dann mit dem Packet etwas machen sollst.

Grüße

Ralf
Titel: Re: Java Agent für UDP
Beitrag von: flaite am 11.09.08 - 18:26:33
Einmal abgesehen davon, dass du niemals Exception Klammern leer läßt (es sei denn du weißt wirklich was du da gerade tust).
Code

			} catch (SocketException Signal) {
Signal.printStackTrace();
			} catch (IOException Signal) {
Signal.printStackTrace();
			};
Bitte, bitte, bitte. Solange man kein Logging jedwegen flavours verwendet, sollte man zumindest dieses printStackTrace dahintun.

Oder, wenn du keinen Bock auf checked Exception hast, einfach throws Exception oben in die Methode.
Und in der Klasse DatagramPacket gibts keine Methode setData(int). Höchstens setData(byte[] b);

Java eignet sich sehr schlecht für solche Copy und Paste Aktionen von Leuten, die nicht so recht wissen, was sie tun.

Bin ja inzwischen nicht der einzigste, der in den Blog-Kommentar-Diskussionen Groovy zur guten Idee für Notes erklären.
Damit ging das eher als mit Java. 
 
Ich würd eines der zahlreichen Kurz-Tutorials mit Beispiel-Code in Eclipse laden. Das ausprobieren, dann eine in Notes benutzbare Klasse schreiben. In Eclipse mit Junit3.8 die nötigen Integrationstests schreiben, diese ausführen und dann das ganze in einen Notes-Agenten importieren
Vielleicht sollte ich darüber mal bloggen.
Titel: Re: Java Agent für UDP
Beitrag von: Pir0x am 12.09.08 - 08:51:45
ups, wie mir scheint hab ich den falschen Code gepostet xD

hier nochmal der Richtige

Code
import lotus.domino.*;
import java.io.*;
import java.net.*;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.lang.*;
import java.nio.channels.*;

public class JavaAgent extends AgentBase 
{
	static final char stx = '\u0002';
	static final char cr = '\r';
	static final char etx  = '\u0003';
	static final char soh = '\u0001';
	public void NotesMain() 
    {

		try 
         {
			Session session = getSession();
			AgentContext agentContext = session.getAgentContext();
			System.out.println("gestartet");


			
				String segal=stx+"11ETeststring" + cr;
				InetAddress address = InetAddress.getByName("192.168.72.40"); 
				byte[] buf = new byte[256];
				String received;
				DatagramSocket UDPSocket = new DatagramSocket( 1024);
				DatagramPacket UDPPacket = new DatagramPacket(segal.getBytes(), segal.length(), address,1024);
                    UDPSocket.setSoTimeout(2000);
		       
				System.out.println("angelegt"); 
				
				UDPSocket.send(UDPPacket);
				System.out.println("gesendet");

				UDPPacket = new DatagramPacket (buf, buf.length);
				UDPSocket.receive(UDPPacket);
                                System.out.println("empfangent");
				received = new String (UDPPacket.getData(), 0, UDPPacket.getLength());
				System.out.println(received);
				
				System.out.println(UDPPacket.getData());
				UDPSocket.close();
						
			
		} 
		catch(Exception e) 
		{
			e.printStackTrace();
		}
	}
	
}

also das Sende ist garkein Problem, klappt ohne Probs, schwieriger siehts da beim Empfangen aus, bevor nach dem Senden die Daten zurückkommen hat sich mein Notes abgeschossen :/
das Letzte was ich sehe ist die ausgabe durch
Code
System.out.println("gesendet");

jemand nenn Tip was ich damachen kann damit ich das Packet zurückbekomme ohne das Notes abschmiert ?

EDIT: ich hab erstmal nenn SoTimeout mit eingebaut das Notes nicht absturzt, jedoch komm ich nicht über gesendet hinaus

hier mal der Inhalt meiner Java Konsole
Code
gestartet
angelegt
gesendet
java.net.SocketTimeoutException: Receive timed out
	at java.net.PlainDatagramSocketImpl.peekData(Native Method)
	at java.net.DatagramSocket.receive(DatagramSocket.java:674)
	at JavaAgent.NotesMain(JavaAgent.java:39)
	at lotus.domino.AgentBase.runNotes(Unknown Source)
	at lotus.domino.NotesThread.run(Unknown Source)
Titel: Re: Java Agent für UDP
Beitrag von: Ralf_M_Petter am 12.09.08 - 09:44:17
Ist doch offensichtlich was passiert, die Gegenstelle schickt das Packet nicht zurück, oder es kommt bei Deinem Rechner nicht an. Übrigens UDP ist ein Protokoll ohne garantierte Übertragung. Das heisst du musst in Deinem Code Vororgetreffen, dass das Paket wiederholt geschickt wird, wenn es verloren geht. Am besten du nimmst um das Problem weiter einzugrenzen mal Wireshark zum überwachen der Kommunikation. Eventuell kommt das Packet gar nicht bei der Endstelle an, oder es geht beim Rückweg verloren. Beides siehst du perfekt mit Wireshark.

Grüße

Ralf
Titel: Re: Java Agent für UDP
Beitrag von: Pir0x am 12.09.08 - 10:21:42
danke für das Programm, also es scheint so als ob das Datapacket mit dem

11ETeststring bei der Zieladresse ankommt, allerdings ohne Rückmeldung, woran kann das liegen ?
Titel: Re: Java Agent für UDP
Beitrag von: Ralf_M_Petter am 12.09.08 - 10:35:39
Was ist das Ziel für ein Gerät. Das ist doch nicht Notes, da müsstet du dann mit dem hersteller oder Support dieses Geräts Kontakt aufnehmen. Eventuell verwendest du den falschen Port oder du hast einen Fehler in deinen Daten.

Hast du einen anderen Client bei dem die Kommunikation funktioniert, dann am besten mit Wireshark die funktionierende Kommunikation abhören und dann schauen wie sich dein Datenpaket von dem funktionierenden unterscheidet.

Grüße

Ralf
Titel: Re: Java Agent für UDP
Beitrag von: Pir0x am 12.09.08 - 10:56:44
ich habs auch schon mit nemm anderen Client probiert, auch hier bekomm ich nix zurück, allerdings bin ich mir beim Port nicht sicher :(
Titel: Re: Java Agent für UDP
Beitrag von: Ralf_M_Petter am 12.09.08 - 11:07:59
Mit was willst du überhaupt kommunizieren?
Kannst du mit einem anderen Programm eventuell mit einer mitgelieferten Software mit dem Gerät komunizieren?

Grüße

Ralf
Titel: Re: Java Agent für UDP
Beitrag von: flaite am 12.09.08 - 11:57:45
Ich würd an der Stelle ein Eclipse Projekt erzeugen, den code, der nix mit Domino da reinposten und dann von da aus das ganze versuchen.
Dann siehst du, obs an Domino Agenten liegt oder nicht. Ich kann das so nicht sagen.
Titel: Re: Java Agent für UDP
Beitrag von: Pir0x am 12.09.08 - 13:27:19
huhu, also hat sich alles geklärt, läuft Problemlos als Java Agent

problem war der Prot