Wysyłanie tablicy obiektów przez UDP.

0

Witam,

Mam klasę Pole() który reprezentuje pojedyncze pole od gry warcaby, z metodami set i get. Służą one do: ustawiania rodzaju pionka, oznaczania które pole ma bicie (tzn. pionek), wsp x i y (położenie na planszy, potrzebna dla metody paint) itp. Wszystkie zmienne są typu int. Mam stworzona tablicę dwuwymiarową tych obiektów [8][8] czyli całą plansze. Normalnie wysyłałem i odbierałem całą planszę za pomocą TCP prze normalne sockety (obiekt implementuje interfejs Serializable), ale prowadzący który mi to ocenia zażyczył sobie aby było to zrobione przy pomocy protokołu UDP. Jak najlepiej to zrobić ? Na początku myślałem aby wszystkie dane z planszy zmieścić do tablic int [384] i zamienić ja na tablicę bajtów, następnie stworzyć pakiet i go wysłać. Po drugiej stronie następuje natomiast odwracanie całej operacji. Wydaje mi się to trochę na około.

Pozdrawiam i czekam na odp.

0

UDP ma rozmiar 2^16-28 bitow. Jak bys tego nie wyslal, powinienes sie zmiescic w jedym pakiecie. Mozesz to skompresowac do dwoch bitsetow (po jednym dla pionkow kazdego z graczy), co w sumie da 128 bitow. Osobiscie nie widze problemu w tym zadaniu.
Pozdr.

0
02Eh napisał(a):

UDP ma rozmiar 2^16-28 bitow.

2^16-28 bajtow, oczywgipsie.

1

Obiekt możesz serializować do tablicy bajtów, najlepiej za pomocą ByteArrayOutputStream, następnie zapisaną tablicę wysyłasz przez pakiet, po odebraniu do ByteArrayInputStream i ładujesz z powrotem na obiekt.

0

Zrobiłem tak jak Visher i działa, teraz muszę tylko zaimplementować prosty mechanizm niezawodności przesyłania danach. Pomysł jest taki aby klient wysyłał powiedzenie dobrania pakietu, serwer jeśli przez określony czas nie otrzyma potwierdzenie ma dokonać retransmisję. Tyle tylko, że jak serwera będzie czekał na to potwierdzenie to będę miał cały czas zablokowany cały program. Wie ktoś jak to rozwiązać ?

0

Wprowadzę zmienną boolean potwierdzenie, która przed wysłaniem będzie ustawiana na false, a po otrzymaniu potwierdzenia od klienta na true. Wprowadzę nowy wątek który od momentu wysłania planszy i zaraz po starcie uśpi się na 1s i po wybudzeniu sprawdzi jaką wartość będzie miało pole potwierdzenie jeśli false to jeszcze raz wywoła metodę do wysłania planszy. Tak będzie dobrze ? Nie mam czasu tego sprawdzić muszę iść do pracy. Jak będziecie mieli lepsze pomysły to proszę piaście.

0
SuperNoob napisał(a):

prowadzący który mi to ocenia zażyczył sobie aby było to zrobione przy pomocy protokołu UDP
UDP jest złym wyborem w tym przypadku, może wystarczy przekonać o tym prowadzącego? Pakiety UDP mogą:

  • nie dotrzeć wcale do serwera
  • być zwielokrotnione
  • dojść w innej kolejności niż zostały wysłane
    Musiałbyś samemu zaimplementować korekcję tych "błędów", a tym się właśnie zajmuje TCP więc po co wymyślać koło od nowa?

1 użytkowników online, w tym zalogowanych: 0, gości: 1