java UDP przesyłanie polskich znaków

java UDP przesyłanie polskich znaków
dante02891
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:4
0

Piszę aplikację w Javie. Jest to komunikator wykorzystujący klasy DatagramSocket, DatagramPacket i MulticastSocket. Przyczepię się tu do bzdury ale po przebyciu pakietu w jedną stronę polskie znaki zmieniają mi się na "krzaczki". Co ciekawe kiedy serwer wyśle multicastingiem te krzaczki to odebrane z powrotem u klienta to są znowu polskie znaki. Ktoś zna przyczynę i ewentualne rozwiązanie?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A wysyłasz i odbierasz to jako UTF-8?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
4

Pewnie tworzysz stringi za pomoca new String(byte[]) i serwer i klient uzywaja innego domyslnego kodowania (osobne maszyny? systemy operacyjne? moze inne javy?). Jedna strona ma stringa i tworzy z niego bajty za pomoca "mućka".getBytes() i uzywa do tego np. kodowania cp1252 i wysyla takie i takie bajty; druga strona odbiera bajty i wola new String(bytes) ale uzywa kodowania utf-8 - jednak te bajty nie sa w utf-8 tylko w cp1252 wiec sa krzaki. Jednakze, pobranie tych bajtow i wyslanie w druga strone spowoduje ze druga strona odbierze bajty i new String(bajty) uzywa utf-8, czyli poprawnego kodowania, i wszystko dziala. (Oczywiscie, w momencie tworzenia string z bajtow w zlym kodowaniu i nastepnie pobranie bajtow z takiego stringa moze dac w wyniku inne bajty niz oryginalnie poniewaz moglo dojsc do straty informacji, ale z tego co rozumiem tak sie tutaj nie dzieje).
Aby temu zapobiec musisz np. ustalic ze dane zawsze sa wymieniane w jakims kodowaniu unicode (np. utf-8, jak wspomnial @Shalom) - umowmy sie, nie uzywasz unicode - robisz to zle! Albo wraz z kazdym pakietem danych wysylasz rowniez kodowanie (np. tak dziala protokol http), jednak to chyba niepotrzebne, utf-8 potrafi zareprezentowac chyba wszystko co potrzebujesz (albo masz bardzo egzotyczne potrzeby ;d). Dodatkowo, uzywasz metod String.getBytes(Charset) (np. "mućka".getBytes(StandardCharsets.UTF_8) a Java 7) oraz konstruktora String(bytes, Charset) (np. new String(bytes, StandardCharsets.UTF_8). Jelsi uzywasz Readera / Writera a nie Input/OutputStream, to musisz uzyc InputStreamReader / OutputStreamWriter ktore biora Input/OutputStream z socketa jako argument, oraz kodowanie - inaczej uzywaja platformowych defaultow i wracasz do punktu wyjscia.

Ja tylko zgaduje, moze zupelnie zle, musialbys powiedziec wiecej na temat OS, czy masz 2 kompy czy jeden, a moze wirtualki? Czy serwer uruchamiasz z konsoli a klienta np. w eclipse (np. windows uzywa - uzywal? - jakiegos innego kodowania, ale eclipse pod windowsem uzywal utf-8, zdaje sie, i widzialem mnostwo podobnych bledow), jak tworzysz stringi i jak robisz z nich bajty, jak wysylasz dane, jak je pobierasz (zwykle InputStreamy? Readery / writery? te drugie uzywaja domyslnego kodowania znakow. Itp. itd.

dante02891
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:4
0

Działam pod win7, oba moduły (server i klient) mają gui więc każdy input odbywa się za pośrednictwem obiektów swing. I faktycznie serwer odpalam z konsoli, a klienta na eclipsie. W Eclipsie mam domyślnie poustawiane kodowanie UTF-8. No i pod konsolą odpalam binarki wygenerowane przez środowisko, ergo - wszystko z tej samej kompilacji. Pomysł z konstruktorem String'a wydaje mi się do rzeczy; sprawdzę go dzięki.

dante02891
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:4
0

i faktycznie to załatwia sprawę, dzięki za pomoc :)

Kandif
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:231
0

Tak po za tematem, do komunikatorów nie lepiej używać TCP niż UDP ?


"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'
dante02891
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:4
0

Oczywiście, ale takie mam zadanie na uczelni(to w zasadzie 1/4 zadania). Pomęczyć się z pisaniem i wywnioskować, że połowa jest nie tak, jak należy...

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@Kandif @dante02891 to zależy do jakiej komunikacji. TCP ma swoje zalety ale ma też wady. Jak przesyłasz pliki to chcesz zeby całe doszły więc TCP z retransmisjami jest ok. Ale jak streamujesz audio/video to nie chcesz zeby się rozjeżdżały tylko dlatego że pakiety dochodzą w złej kolejności. W tym wypadku lepiej jak jakiś pakiet zginie niż żeby się pojawił za późno. No i UDP pozwala nadawać multicastem ;) Jest też dużo "lżejsze" bo nie wymaga wymiany uścisków dłoni i synchronizacji. W efekcie jak chcesz często nawiązywać połączenie i wysyłac niewiele danych to narzut TCP moze okazać sie bardzo duży.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)