Odbieranie danych w połączeniach server - client

Odpowiedz Nowy wątek
2011-07-19 11:56
0

Witam, napisałem serwer obsługujący połączenia asynchroniczne, pisałem do niego klienta jako Console Application. Postanowiłem rozszerzyć swój projekt i przerabiam klienta na aplikacje okienkową.
Wszystkie metody odpowiadające za połączenie trzymam w Form1.cs.
Pytanie do was:
Nie działa mi w aplikacji okienkowej odbieranie danych (podczas gdy na tym samym kodzie tylko, że w jednym pliku działało dla aplikacji konsolowej).
Problem tkwi w rozdzieleniu tego na pliki, ktoś wie dlaczego tak się dzieje?

Pozostało 580 znaków

2011-07-19 12:05
0

Pewnie źle programujesz obiektowo, ale bez kodu to sobie można tylko powróżyć.

Pozostało 580 znaków

2011-07-19 12:08
0

No kurde. Ludzie zdajcie sobie sprawę wreszcie, że czy coś działa czy nie w dużej mierze zależy od tego jaki kod napisaliście! Twój post to nie pierwszy gdzie opisuje się problem (dobrze), ale bez linijki kodu(źle). Narazie można powiedzieć tylko tyle, że coś zje**łeś.

Pozostało 580 znaków

2011-07-19 12:16
0

To kod Form1.cs

namespace ClientSocketForm
{
   public partial class Form1 : Form
    {
        byte[] m_dataBuffer = new byte[10];
        IAsyncResult m_result;
        public AsyncCallback m_pfnCallBack;
        public Socket m_clientSocket;
        public string msg;

        public Form1()
        {
            try
            {
                m_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse("127.0.0.1");
                int iPortNo = 4296; 
                IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);
                m_clientSocket.Connect(ipEnd);
            }
            catch (Exception x)
            {
                MessageBox.Show(x.Message.ToString());
                Close();
            }
            InitializeComponent();
        }

        public void WaitForData()
        {
            try
            {
                if (m_pfnCallBack == null)
                {
                    m_pfnCallBack = new AsyncCallback(OnDataReceived);
                }
                SocketPacket theSocPkt = new SocketPacket();
                theSocPkt.thisSocket = m_clientSocket;
                m_result = m_clientSocket.BeginReceive(theSocPkt.dataBuffer,
                                                        0, theSocPkt.dataBuffer.Length,
                                                        SocketFlags.None,
                                                        m_pfnCallBack,
                                                        theSocPkt);

            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }

        }

        public void OnDataReceived(IAsyncResult asyn)
        {
            try
            {
                SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
                int iRx = theSockId.thisSocket.EndReceive(asyn);
                char[] chars = new char[iRx + 1];
                System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
                int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
                System.String szData = new System.String(chars);
                richTextBox1.Text = richTextBox1.Text + szData;
                WaitForData();
            }
            catch (ObjectDisposedException)
            {
                System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }
    }
}

To Program.cs

namespace ClientSocketForm
{
   static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Pozostało 580 znaków

2011-07-19 12:32
0

Albo czegoś nie widzę, albo nigdzie nie jest wywoływana metoda WaitForData().


Some people see things as they are, and say "why?". I dream things that never were and say "why not?".

Pozostało 580 znaków

2011-07-19 14:43
0

Poza tym że używasz obiektów jakie MS dostarczył w .net to z programowaniem obiektowym wiele wspólnego to nie ma.
Próba połączenia w konstruktorze formy nie jest najlepszym pomysłem, lepiej zrobić to w Load formy. Close() w konstruktorze formy głównej programu to już ewidentny brak wiedzy o win forms, spowoduje to Dispose formy i Application.Run dostanie obiekt, który już przeznaczony jest do usunęcia i poleci ObjectDisposedException. Generalnie w konstruktorze formy nie należy w taki sposób obsługiwać wyjątków.

Wnioskuję że chciałbyś asynchronicznie odpytać o jakąś porcję danych. Jeśli uda się je pobrać, to próbujesz pobrać kolejną porcję danych. Tak?
Tylko dla czego tak? Nie lepiej mieć osobny wątek czytający w tle i informujący jakiegoś nadzorcę (wątek gui) że coś przeczytał i można to skonsumować? zasada KISS.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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