Клиент-серверное приложение перстает работать при отправке/приеме 3-4 сообщений - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! При создании сервера (пока он ещё на начальном этапе и я сделал только самое простое) у меня возникла проблема: сначала сервер получает сообщения от клиента и отправляет уведомление. Потом он начинает получать сообщения от клиента и отправлять уведомления о доставке. После двух или нескольких сообщений клиент перестает получать уведомления, а сервер перестает воспринимать окружающие подключения. Вот код сервера:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
 
namespace SocketServer
{
    public partial class Form1 : Form
    {
        Socket server = null;
        //Socket client = null;
        bool RunChat = false;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void startServerButton_Click(object sender, EventArgs e)
        {
 
            if (server != null && server.Connected)
                server.Disconnect(false);
 
            int port = 12345;
            if (portTextBox.Text != "")
                port = Convert.ToInt32(portTextBox.Text);
            else
                MessageBox.Show("используется порт по умолчанию: 12345");

            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            EndPoint endPoint = new IPEndPoint(IPAddress.Any, port);

            try
            {
                server.Bind(endPoint);
                server.Listen(100);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Невозможно запустить сервер " + exc.Message);
                return;
            }
 
            server.BeginAccept(new AsyncCallback(AsyncAcceptCallback_), server);
        }
 
        void AsyncAcceptCallback(IAsyncResult result)
        {
            Socket serverSocket = (Socket)result.AsyncState;
 
            SocketData data = new SocketData();
            data.ServerConnection = serverSocket.EndAccept(result);
 
            data.ServerConnection.BeginReceive(data.Buffer, 0, 1024, SocketFlags.None,
                    new AsyncCallback(ReadCallback), data);
        }
 
        void ReadCallback(IAsyncResult result)
        {
            SocketData data = (SocketData)result.AsyncState;
            int bytes = data.ServerConnection.EndReceive(result);
 
            if (bytes > 0)
            {
                string s = Encoding.UTF8.GetString(data.Buffer, 0, bytes);
 
                try
                {
                    clientRichTextBox.AppendText(s + "\n");
                }
                catch (Exception exc) { }
 
                data.ServerConnection.Send(Encoding.UTF8.GetBytes("Получено: " + s.Length + " символов"));
                RunChat = true;
            }
 
        }
 
        void AsyncAcceptCallback_(IAsyncResult result)
        {
            Socket serverSocket = (Socket)result.AsyncState;
 
            SocketData data = new SocketData();
            data.ServerConnection = serverSocket.EndAccept(result);
 
            data.ServerConnection.BeginReceive(data.Buffer, 0, 1024, SocketFlags.None,
                    new AsyncCallback(ReadCallback_), data);
            server.BeginAccept(new AsyncCallback(AsyncAcceptCallback), server);   
        }
 
        void ReadCallback_(IAsyncResult result)
        {
            SocketData data = (SocketData)result.AsyncState;
            int bytes = data.ServerConnection.EndReceive(result);
 
            if (bytes > 0)
            {
                string s = Encoding.UTF8.GetString(data.Buffer, 0, bytes);
 
                try
                {
                    clientRichTextBox.AppendText(s + "\n");
                }
                catch (Exception exc) { }
 
                data.ServerConnection.Send(Encoding.UTF8.GetBytes("Сервер: соединен"));
                RunChat = true;
            }
 
        }
 
        public IPAddress GetAddress(string address)
        {
            IPAddress ipAddress = null;
            try
            {
                ipAddress = IPAddress.Parse(address);
            }
            catch (Exception)
            {
                IPHostEntry heserver;
 
                try
                {
                    heserver = Dns.GetHostEntry(address);
                    if (heserver.AddressList.Length == 0)
                    {
                        return null;
                    }
                    ipAddress = heserver.AddressList[0];
                }
                catch
                {
                    return null;
                }
            }
 
            return ipAddress;
        }
 
        private void timerServer_Tick(object sender, EventArgs e)
        {
            if (RunChat)
            {
                try
                {
                    server.Listen(100);
                }
                catch (Exception exc)
                {
                    MessageBox.Show("Ошибка прослушивания: " + exc.Message);
                    RunChat = false;
                    return;
                }
 
                server.BeginAccept(new AsyncCallback(AsyncAcceptCallback), server);
 
                RunChat = false;
            }
        }
    }
 
    class SocketData
    {
        public const int BufferSize = 1024;
 
        public Socket ServerConnection { get; set; }
 
        byte[] buffer = new byte[BufferSize];
 
        public byte[] Buffer 
        {
            get { return buffer; }
            set { buffer = value; }
        }
    }
}
Вот код клиента:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
 
namespace SocketClient
{
    public partial class Form1 : Form
    {
        Socket client = null;
        int id = 0;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void connectButton_Click(object sender, EventArgs e)
        {
            if (client != null && client.Connected)
                client.Disconnect(false);
 
            IPAddress addr = GetAddress(serverAddressTextBox.Text);
            if (addr == null)
            {
                MessageBox.Show("Я в шоке, не смог разобрать адрес");
                return;
            }
 
            int port = 12345;
            if (portTextBox.Text != "")
                port = Convert.ToInt32(portTextBox.Text);
            else
                MessageBox.Show("используется порт по умолчанию: 12345");
 
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            EndPoint point = new IPEndPoint(addr, port);
            try
            {
                client.Connect(point);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ошибка соединения: " + exc.Message);
            }
            if (client.Connected)
            {
                MessageBox.Show("Подключен!");
            }
 
            this.id = Convert.ToInt32(textBoxID.Text);
 
            client.Send(Encoding.UTF8.GetBytes("ID: " + this.id.ToString() + " Password: " + textBoxPassword.Text + " - Подключен!"));
 
            byte[] buffer = new byte[1024];
            int bytes = 0;
 
            try
            {
                bytes = client.Receive(buffer);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ошибка подключения: " + exc.Message);
            }
            
            if (bytes > 0)
            {
                string s = Encoding.UTF8.GetString(buffer, 0, bytes);
                clientRichTextBox.AppendText(s + "\n");
            }
        }
 
        void AsyncAcceptCallback(IAsyncResult result)
        {
            Socket serverSocket = (Socket)result.AsyncState;
 
            SocketData data = new SocketData();
            data.ClientConnection = serverSocket.EndAccept(result);
 
            data.ClientConnection.BeginReceive(data.Buffer, 0, 1024, SocketFlags.None,
                    new AsyncCallback(ReadCallback), data);
        }
 
        void ReadCallback(IAsyncResult result)
        {
            SocketData data = (SocketData)result.AsyncState;
            int bytes = data.ClientConnection.EndReceive(result);
 
            if (bytes > 0)
            {
                string s = Encoding.UTF8.GetString(data.Buffer, 0, bytes);
 
                try
                {
                    clientRichTextBox.AppendText(s + "\n");
                }
                catch (Exception exc)
                { }
                data.ClientConnection.Send(Encoding.UTF8.GetBytes("ID: " + this.id.ToString() + "Получено!"));
            }
 
        }
 
        public IPAddress GetAddress(string address)
        {
            IPAddress ipAddress = null;
            try
            {
                ipAddress = IPAddress.Parse(address);
            }
            catch (Exception)
            {
                IPHostEntry heserver;
 
                try
                {
                    heserver = Dns.GetHostEntry(address);
                    if (heserver.AddressList.Length == 0)
                    {
                        return null;
                    }
                    ipAddress = heserver.AddressList[0];
                }
                catch
                {
                    return null;
                }
            }
 
            return ipAddress;
        }
 
        private void sendButton_Click(object sender, EventArgs e)
        {
            if (client != null && client.Connected)
                client.Disconnect(false);
 
            IPAddress addr = GetAddress(serverAddressTextBox.Text);
            if (addr == null)
            {
                MessageBox.Show("Я в шоке, не смог разобрать адрес");
                return;
            }
 
            int port = 12345;
            if (portTextBox.Text != "")
                port = Convert.ToInt32(portTextBox.Text);
 
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            EndPoint point = new IPEndPoint(addr, port);
            try
            {
                client.Connect(point);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ошибка соединения: " + exc.Message);
            }
 
            try
            {
                client.Send(Encoding.UTF8.GetBytes("ID: " + this.id.ToString() + " Сообщение: " + commandTextBox.Text));
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ошибка отправки: " + exc.Message);
            }
 
            byte[] buffer = new byte[1024];
 
            int bytes = 0;
            try
            {
                bytes = client.Receive(buffer);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ошибка получения уведомления об отправке: " + exc.Message);
            }
 
            if (bytes > 0)
            {
                string s = Encoding.UTF8.GetString(buffer, 0, bytes);
                try
                {
                    clientRichTextBox.AppendText(s + "\n");
                }
                catch (Exception exc)
                {}
            }
        }
    }
 
    class SocketData
    {
        public const int BufferSize = 1024;
 
        public Socket ClientConnection { get; set; }
 
        byte[] buffer = new byte[BufferSize];
 
        public byte[] Buffer
        {
            get { return buffer; }
            set { buffer = value; }
        }
    }
}
иногда все работает, но иногда ...

Решение задачи: «Клиент-серверное приложение перстает работать при отправке/приеме 3-4 сообщений»

textual
Листинг программы
using System.Threading;
 
        void StartServer()
        {
            while (this.IsActive)
            {
                if(this.IsEnable)
                    if (this.RunChat)
                    {
                        try
                        {
                            server.Listen(100);
                        }
                        catch (Exception exc)
                        {
                            MessageBox.Show("Ошибка прослушивания: " + exc.Message);
                            RunChat = false;
                            return;
                        }
 
                        server.BeginAccept(new AsyncCallback(AsyncAcceptCallback), server);
                        RunChat = false;
                    }
                Thread.Sleep(50);
            }
        }
 
        private void startServerButton_Click(object sender, EventArgs e)
        {
            if (!this.IsActive)
            {
                if (server != null && server.Connected)
                    server.Disconnect(false);
 
                int port = 12345;
                if (portTextBox.Text != "")
                    port = Convert.ToInt32(portTextBox.Text);
                else
                    MessageBox.Show("используется порт по умолчанию: 12345");
 
 
                server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                EndPoint endPoint = new IPEndPoint(IPAddress.Any, port);
 
                try
                {
                    server.Bind(endPoint);
                    //server.Listen(100);
                }
                catch (Exception exc)
                {
                    MessageBox.Show("Невозможно запустить сервер " + exc.Message);
                    return;
                }
 
                this.RunChat = true;//для приема нового сообщения
                this.IsActive = true;//для работы потока
                this.IsEnable = true;//для временного прерывания\возобновления потока, при этом данные на сокете, ожидающие принятия программой не пропадают
 
                myThread = new Thread(new ThreadStart(StartServer));
                myThread.Start();
            }
        }
//...

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.538 из 5
Похожие ответы