Przesłanie tablicy z jednego programu do drugiego

0

Witam

W końcu udało mi się połączyć funkcję klienta i serwera w jednym programie. Dodałem to do gry i teraz chce przesłać ruch z jednej aplikacji do drugiej. Problem jest w tym, że nie potrafię tego zrobić. Ze stringami jakoś idzie, ale wysyłanie tablicy do funkcji już nie :/ Aplikację łączą się ze sobą prawidłowo, ale nie wiem jak zmodyfikować ten fragment kodu:

string tekst = txtWysylane.Text;
            if (tekst == "") { txtWysylane.Focus(); return; }
            if (tekst[tekst.Length - 1] == '\n')
                tekst = tekst.TrimEnd('\n');
            w.Write(tekst);
            wyswietl(txtOtrzymywane, "===== Ja =====\n" + tekst + '\n');
            txtWysylane.Text = "";

by przesyłał do drugiego programu ruch, po wywołaniu zdarzenia:

  private void MainForm_MouseDown(object sender, MouseEventArgs e)
        {
            int x = e.X;
            int y = e.Y; // +20;

            if (x >= 20 && x < 340 && y >= 40 && y < 360
                && (x + 22) % 40 != 0 && (x + 21) % 40 != 0
                && (y + 2) % 40 != 0 && (y + 1) % 40 != 0)
            {
                int _x, _y;
                _x = (x - 20) / 40;
                _y = (y - 40) / 40;
                			//string text = "x=" + x.ToString() + " y=" + y.ToString() + "_x=" + _x.ToString() + " _y=" + _y.ToString();
                			//MessageBox.Show(text, "_x, _y");
                		    //	System.out.println(_x + " " + _y);
                bicia.sprawdz_bicia(gracz, plansza);
                ruchy.klikniecie(_x, _y, plansza, bicia, gracz);
                Refresh();
                  }
        }

Pewnie trzeba też zamienić tą linijkę:

private BinaryWriter w = null;

na coś innego, ale czytam o przesyłaniu danych w C# i jakoś nie widzę innej możliwości.

W załączniku zamieściłem cały projekt, gdyby ktoś miał czas i był tak miły looknąć i dać jakąś podpowiedź w tej strawie, to będę wdzięczny.

Pozdrawiam

0

Wg mnie najlepszym sposobem byłoby wykorzystanie Remotingu. Pracuje się w tym naprawdę przyjemnie a i opisów co i jak znajdziesz pełno. W dużym skrócie serwer tworzy kanał, a klient z niego korzysta. Operujesz na obiektach i i nic Cię naprawdę nie obchodzi. Nawet jak nie użyjesz to zachęcam do poczytania o Remotingu.

1

A może wysyłaj tekst z opisem ruchu, jeśli nie chcesz dużo zmieniać?

0

@za duchem czasu ja myślę, że za dużo zamoty by z tym teraz było. Program niemal skończony tylko, ta jedna głupota została :/

@Heko, w sumie o tym nie pomyślałem. Na siłę staram się wysłać tablicę, a mogę ją przecież wysłać jako string i już na miejscu nadpisać jako tablicę :) Dziękuje za mysł, podziałam i zobaczę co z tego wyjdzie.

Pozdrawiam

0

Siedzę tyle czasu i coś mi panowie nie wychodzi :/
Niby przesyła ta tablicę, ale piony nie zmieniają pozycji a po 2 kliknięciu tablica się zeruje :/

W odbieraniu wrzucam coś takiego:

 for (int j = 0; j < 8; j++)
                {
                    for (int i = 0; i < 8; i++)
                    {
                        this.plansza.pole[i, j] = int.Parse(tekst);
                    }
                }

Przy czym wysyłam tablicę w ten sposób:

 for (int j = 0; j < 8; j++)
                {
                    for (int i = 0; i < 8; i++)
                    {
                        string tekst = plansza.pole[i, j].ToString();
                        // if (tekst[tekst.Length - 1] == '\n')
                        //     tekst = tekst.TrimEnd('\n');
                        w.Write(tekst);

Jeśli ktoś będzie miał chwilkę by mi powiedzieć co robię nie tak, to będę wdzięczny. Do załącznika, wrzucam aktualny kod.

1

Jak dla mnie to masz za mało czytania.

tekst = r.ReadString()

Odbierasz jedną porcję danych i wypełniasz nią całą tablicę.

for (int j = 0; j < 8; j++)
{
   for (int i = 0; i < 8; i++)
   {
      this.plansza.pole[i, j] = int.Parse(tekst);
   }
}
2

string tekst = plansza.pole[i, j].ToString();
w.Write(tekst);

Głupie pytanie, ale dla tablicy
1 | 2 | 3
4 | 15 | 6
7 | 81 | 9
otrzymasz 12341567819, a

this.plansza.pole[i, j] = int.Parse(tekst);

przypisuje każdemu polu to samo :]

0

@Heko problem w tym że nie wiem jak to rozdzielić. Pierwszy raz działam na gniazdach i brak mi pomysłu na przeslanie tej tablicy :/

@msm to samo co wyżej. Nie wiem jak przesłać tablicę, ewentualnie przesłać pojedynczo elementy tablicy i wypełnić nimi tablicę po odebraniu danych.

1

Trochę Ci tam pozmieniałem (między innymi adres ip, żebyś się nie dziwił dlaczego Ci się program nie łączy (tak jak ja byłem zdziwiony z początku, że się nie łączył he he)), program jeszcze nie działa do końca dobrze, ale może sobie dorobisz resztę.

0

@Heko dzięki serdeczne. Z tego co widzę teraz ładnie to wysyła, tylko nie wiem dlaczego program się wysypuje. Czasami zaraz po uruchomieniu, przy wpisywaniu tablicy do okna, a czasami po 2 kliknięciu.

1

Wydaje mi się, że błędy mogą być spowodowane przez wątki.

Nie powinny one modyfikować niczego, czego same nie stworzyły. Poprawnie jest tak jak Ci zrobiłem ze zdarzeniem backgroundworkera w metodzie Odbieranie_k_DoWork.

Odbieranie_k.ReportProgress(int.Parse(tekst), new Point(j, i));

A w obsłudze zdarzenia Odbieranie_k_ProgressChanged mogą być dopiero modyfikowane jakiekolwiek pola formy (tekst boxy, plansza itp.).

0

Czyli musiałbym zmodyfikować w podobny sposób Odbieranie? Bo na razie nic nie modyfikowałem i aplikacja wysyła dane od serwera do klienta (chodź gubi nieco po drodze), ale z serwera do klienta już nie. Wiem że truję, ale wątki, TCP/IP to dla mnie magia w tym momencie i nawet nie mam punktu zaczepu.

EDIT:
Po wlączeniu sleep na starcie ładnie i bez błędów wyswietla tablicę, dopiero po kliknięciu zaczyna się sypać, ale to już cos :)

0

U mnie bez sleepa nic nie gubi, dziwne.

Tak, powinieneś podobnie zmodyfikować tę metodę. Ponadto z tego co widzę powinieneś sobie dołożyć informację, który gracz obecnie wykonuje ruch. Dzięki temu będziesz wiedział, który player obecnie powinien wykonać akcję i ta strona, która nie może jej wykonywać nie powinna wysyłać żadnych informacji nawet jeśli użytkownik by coś tam sobie klikał.

Po prostu póki co klient nie dostaje żadnej informacji, że player obecnie wykonujący ruch powinien się zmienić.

Daj znać jak coś tam pozmieniasz.

0

Jako, że zainteresował mnie ten program wrzuciłem go na code.google. Podstawowa gra przez sieć działa, ale nie o wszystkich aspektach programiku można to jeszcze powiedzieć.

http://code.google.com/p/checkers-warcaby/

Jak ktoś jest zainteresowany działaniem code.google lub chce coś zmienić w projekcie, to niech da znać, to dam mu prawo do comitowania.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.