Клиент-серверное приложение перстает работать при отправке/приеме 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();
- }
- }
- //...
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д