h1

UDPClient + UDPServer.

Październik 26, 2006

ok, tak jak pisałem wczoraj wziąłem się dziś za zakodowanie tego szablonu który tam przedstawiłem. Szło to mniej więcej tak :

1. klient wczytuje z inputa dane a potem przesyla go socketem do serwera. (stringa)
2.serwer pobiera dane z gniazda
3.serwer zmienia dane
4.serwer przesyla zmodyfikowane socketem dane do klienta
5.klient wczytuje swoim socketem zmodyfikowane dane i wyrzuca na output.

Teraz jak to działa ? otwieram sobie klienta, wpisuje w nim coś
\server\dist>java -jar UDPClient.jar
jakisstring

moj string zostaje pobrany z inputa (readlinem) a następnie przypisuje go do tablicy bajtów sendData (po odpowiedniej konwersji typów).
sendData = sentence.getBytes();
no i jak już mamy nasze sendData to teraz wypadałoby stworzyć pakiecik który pójdzie w eter. Zastanówmy się czego potrzebujemy w pakiecie. Jak już wspominałem wcześniej w UDP nie ma potoczku więc za każdym razem musimy adresować nasz pakiet. Teraz coś co dla mnie nie robi różnicy (tj prawdopodobnie nie rozumiem tego ale mi to nie przeszkadza, po prostu tak jest i tyle :]) tj : obiekt pakietu sendPacket jest typu DatagramPacket. Czyli again, nasz pakiet potrzebuje informacji o adresie IP hosta, numerze portu, długości danych no i samych danych.. a wygląda to mniej więcej tak :
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, // wspsominana wyzej dlugosc danych
IPAddress, // adres IP hosta
9999); //numer portu w tym wypadku dalem 9999.

what now ? teraz już mamy utworzony pakiet wiec wypadałoby go wysłać w sieć. Do tego celu wykorzystamy metodę send() obiektu clientSocket i wysłanie socketem o tej samej nazwie :)
clientSocket.send(sendPacket);

no i cool, pakiet poszedl w siec, co sie teraz dzieje ? serwer odbiera swoim gniazdkiem nasz pakiecik, gniazdo :
DatagramSocket serverSocket = new DatagramSocket(9999);
wszystko fajnie ale teraz należy pamiętać że przesyłany przez nas pakiet to nie tylko nasz string ale i inne informacje.. a przecież głupio by było gdybyśmy sobie gadali na gadu-gadu i przed wypowiedzią w rozmowie widzielibyśmy wszystkie pozostałe śmieci z pakietu… co więc zrobić ? proste, trzeba odseparować naszego stringa od pozostałych danych.
String sentence = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();

no i pozostało zadanie skapitalizowania naszego stringa (przy uzyciu toUpperCase() )
Sring capitalizedSentence = sentence.toUpperCase();
i odesłanie go spowrotem do klienta, first konwersja danych i przypisanie do talblicy bajtów sendData.
sendData = capitalizedSentence.getBytes();
no i ofcousre tworzymy od nowa pakiet :
DatagramPacket sendPacket = new
DatagramPacket(sendData, sendData.length, IPAddress, port);

i co? i sialalalalal poszłooooooo
serverSocket.send(sendPacket);

No i ok, ale to niestety dopiero początek kodowania. Teraz zgodnie z zadaniem muszę jeszcze zrobić :
-wczytywanie z pliku danych o adresie IP i porcie hosta
-mała modyfikacja serwera która sprawi że dane niezmienione prześle dalej do innego klienta który z kolei zmieni dane, prześle spowrotem do serwera a ten odda je klientowi początkowemu.
Jakie trudności ?
-jak poinformować że klient od którego dostaje dane jest początkowym ? Czy to ważne ? :]
-jak w pakiecie przesłać adres IP komputera docelowego i serwera …
no i na teraz to tyle.
pozdrawiam :)

One comment

  1. o LOL ;D



Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: