# Nochmal UDP



## Guest (12. Feb 2008)

Hi ich hab kurze frage zu UDP:

Client und Server sind auf dem selben PC.
Client sagt das der Port 27900 schon belegt ist.

```
message = testTCP(server, message, 6667);
		message = testTCP(server, message, 28910);
		message = testTCP(server, message, 29900);
		message = testTCP(server, message, 29920);
		textArea.setText(message);

		message = testUDP(server, message, 27900);
		message = testUDP(server, message, 4321);
```

Wenn ich die applikation meinem vServer starte und mich lokal damit verbinde scheint es so alsob keine Verbindung offen ist.

Hier die Klassen:

Server: 

```
package de;

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

public class Tester{
	public static class UDPTester extends Thread {
		public final int port;
		private final DatagramPacket paket;

		public UDPTester(int port) {
			super("UDP " + port);
			this.port = port;
			paket = new DatagramPacket(new byte[256], 256);
		}

		public void run() {
			while (isAlive()) {
				DatagramSocket socket;
				try {
					socket = new DatagramSocket(port);

					for (;;) {

						// Warten auf nächstes Paket
						socket.receive(paket);
						String text = new String(paket.getData(), 0, paket
								.getLength());
						paket.setData(text.toUpperCase().getBytes());
						socket.send(paket);
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public static class TCPTester extends Thread {
		public final int port;
		private ServerSocket serSock;

		public TCPTester(int port) throws IOException {
			super("TCP " + port);
			this.port = port;
			serSock = new ServerSocket(port);
		}

		public void run() {
			while (isAlive()) {
				try {
					Socket accept = serSock.accept();
					String string = "Connection OK to port: " + port;
					accept.getOutputStream().write(string.getBytes());
					accept.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public static void main(String[] args) {
		try {
			TCPTester t6667 = new TCPTester(6667);
			TCPTester t28910 = new TCPTester(28910);
			TCPTester t29900 = new TCPTester(29900);
			TCPTester t29920 = new TCPTester(29920);

			UDPTester u4321 = new UDPTester(4321);
			UDPTester u27900 = new UDPTester(27900);

			// Starten
			t6667.start();
			t28910.start();
			t29900.start();
			t29920.start();

			u4321.start();
			u27900.start();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
```

hier das client-applet:

```
package de;

import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;

import javax.swing.JApplet;
import javax.swing.JTextArea;

public class CNCTestApplet extends JApplet {
	private JTextArea textArea;

	@Override
	public void init() {
		textArea = new JTextArea("Tester (re)initialized.");
		getContentPane().add(textArea);
	}

	public void start() {
		String server = getDocumentBase().getHost();
		if (server.equals(""))
			server = "[i]xx.xx.xx.xx[/i]";
		String message = "\nServer: " + server;

		message = testTCP(server, message, 6667);
		message = testTCP(server, message, 28910);
		message = testTCP(server, message, 29900);
		message = testTCP(server, message, 29920);
		textArea.setText(message);

		message = testUDP(server, message, 27900);
		message = testUDP(server, message, 4321);
		textArea.setText(message);
	}

	private String testTCP(String server, String message, int port) {
		message += "\n";
		try {
			message += "Try Connect to port " + port;
			message += "\n";
			Socket s = new Socket(server, port);

			InputStream is = s.getInputStream();
			byte read = ':';
			int chars = 0;
			while (s.isBound() && chars < 200 && read != -1) {

				message += (char) read;
				chars++;

				read = (byte) is.read();
			}
		} catch (Exception e) {
			message += e;

		}

		return message;

	} 

	private String testUDP(String server, String message, int port) {
		message += "\n";
		try {

			message += "Try Connect to port " + port;
			message += "\n";
			DatagramPacket dp = new DatagramPacket(new byte[256], 256);

			InetAddress byName = InetAddress
					.getByName(server);
			DatagramSocket ds = new DatagramSocket(port, byName);
			
			ds.setSoTimeout(200);
			ds.receive(dp);
			String string = new String(dp.getData());
			message += string;
			ds.close();

		} catch (Exception e) {
			message += e;

		}

		return message;

	}
}
```


----------



## Guest (12. Feb 2008)

Anonymous hat gesagt.:
			
		

> Hi ich hab kurze frage zu UDP:
> 
> Client und Server sind auf dem selben PC.
> Client sagt das der Port 27900 schon belegt ist.
> ...



was mache ich falsch/wie verbinde ich also auf meinen server per UDP?


----------



## HoaX (12. Feb 2008)

a) mit udp kannst du dich nicht verbinden, da es verbindungslos ist
b) tut das not wegen einer einzigen zeile 200 andere zu zitieren?


----------



## Guest (13. Feb 2008)

HoaX hat gesagt.:
			
		

> a) mit udp kannst du dich nicht verbinden, da es verbindungslos ist
> b) tut das not wegen einer einzigen zeile 200 andere zu zitieren?


Schon klar, aber meine frage ist warum ich keine verbindung zum server aufbauen kann!


----------



## DocRandom (13. Feb 2008)

Anonymous hat gesagt.:
			
		

> HoaX hat gesagt.:
> 
> 
> 
> ...


..also doch nicht klar!
Oder was glaubst Du heißt *verbindungslos*?

lg
DocRandom


----------



## Guest (13. Feb 2008)

DocRandom hat gesagt.:
			
		

> Anonymous hat gesagt.:
> 
> 
> 
> ...


Ich formuliere es mal anders:
Meine frage ist warum ich keine kommunikation zum server herstellen kann!
Besser?


----------



## HoaX (13. Feb 2008)

weil du es nirgendwo versuchst? ich seh keine stelle an der du etwas an den server sendest ...


----------



## Guest (13. Feb 2008)

HoaX hat gesagt.:
			
		

> weil du es nirgendwo versuchst? ich seh keine stelle an der du etwas an den server sendest ...


Oh, das wirds sein!


----------



## Guest (13. Feb 2008)

Anonymous hat gesagt.:
			
		

> HoaX hat gesagt.:
> 
> 
> 
> ...


Geht trotzdem nicht.


java.net.BindException: Cannot assign requested address: Cannot bind
	at java.net.PlainDatagramSocketImpl.bind0(Native Method)
	at java.net.PlainDatagramSocketImpl.bind(Unknown Source)
	at java.net.DatagramSocket.bind(Unknown Source)
	at java.net.DatagramSocket.<init>(Unknown Source)
	at java.net.DatagramSocket.<init>(Unknown Source)
	at de.CNCTestApplet.testUDP(CNCTestApplet.java:74)
	at de.CNCTestApplet.start(CNCTestApplet.java:34)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)


----------



## DocRandom (13. Feb 2008)

Dann schau Dir mal diese Beispiele an, evtl kommst dann weiter!

lg
DocRandom


----------



## Guest (13. Feb 2008)

DocRandom hat gesagt.:
			
		

> Dann schau Dir mal diese Beispiele an, evtl kommst dann weiter!
> 
> lg
> DocRandom


Tatsächlich!
port und byName gehören zum Packet, nicht zum DatagramSocket.
So müssen "port, byName" aus Zeile 74 in Zeile 70.

Dann klapp's auch mit dem Server.


----------

