Odbieranie danych w połączeniach server - client

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?

0

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

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). na razie można powiedzieć tylko tyle, że coś zje**łeś.

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());
        }
    }
}
0

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

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.

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