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

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

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

Здравствуйте! При создании сервера (пока он ещё на начальном этапе и я сделал только самое простое) у меня возникла проблема: сначала сервер получает сообщения от клиента и отправляет уведомление. Потом он начинает получать сообщения от клиента и отправлять уведомления о доставке. После двух или нескольких сообщений клиент перестает получать уведомления, а сервер перестает воспринимать окружающие подключения. Вот код сервера:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Net;
  9. using System.Net.Sockets;
  10. using System.Diagnostics;
  11. namespace SocketServer
  12. {
  13. public partial class Form1 : Form
  14. {
  15. Socket server = null;
  16. //Socket client = null;
  17. bool RunChat = false;
  18. public Form1()
  19. {
  20. InitializeComponent();
  21. }
  22. private void startServerButton_Click(object sender, EventArgs e)
  23. {
  24. if (server != null && server.Connected)
  25. server.Disconnect(false);
  26. int port = 12345;
  27. if (portTextBox.Text != "")
  28. port = Convert.ToInt32(portTextBox.Text);
  29. else
  30. MessageBox.Show("используется порт по умолчанию: 12345");
  31.  
  32. server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  33. EndPoint endPoint = new IPEndPoint(IPAddress.Any, port);
  34.  
  35. try
  36. {
  37. server.Bind(endPoint);
  38. server.Listen(100);
  39. }
  40. catch (Exception exc)
  41. {
  42. MessageBox.Show("Невозможно запустить сервер " + exc.Message);
  43. return;
  44. }
  45. server.BeginAccept(new AsyncCallback(AsyncAcceptCallback_), server);
  46. }
  47. void AsyncAcceptCallback(IAsyncResult result)
  48. {
  49. Socket serverSocket = (Socket)result.AsyncState;
  50. SocketData data = new SocketData();
  51. data.ServerConnection = serverSocket.EndAccept(result);
  52. data.ServerConnection.BeginReceive(data.Buffer, 0, 1024, SocketFlags.None,
  53. new AsyncCallback(ReadCallback), data);
  54. }
  55. void ReadCallback(IAsyncResult result)
  56. {
  57. SocketData data = (SocketData)result.AsyncState;
  58. int bytes = data.ServerConnection.EndReceive(result);
  59. if (bytes > 0)
  60. {
  61. string s = Encoding.UTF8.GetString(data.Buffer, 0, bytes);
  62. try
  63. {
  64. clientRichTextBox.AppendText(s + "\n");
  65. }
  66. catch (Exception exc) { }
  67. data.ServerConnection.Send(Encoding.UTF8.GetBytes("Получено: " + s.Length + " символов"));
  68. RunChat = true;
  69. }
  70. }
  71. void AsyncAcceptCallback_(IAsyncResult result)
  72. {
  73. Socket serverSocket = (Socket)result.AsyncState;
  74. SocketData data = new SocketData();
  75. data.ServerConnection = serverSocket.EndAccept(result);
  76. data.ServerConnection.BeginReceive(data.Buffer, 0, 1024, SocketFlags.None,
  77. new AsyncCallback(ReadCallback_), data);
  78. server.BeginAccept(new AsyncCallback(AsyncAcceptCallback), server);
  79. }
  80. void ReadCallback_(IAsyncResult result)
  81. {
  82. SocketData data = (SocketData)result.AsyncState;
  83. int bytes = data.ServerConnection.EndReceive(result);
  84. if (bytes > 0)
  85. {
  86. string s = Encoding.UTF8.GetString(data.Buffer, 0, bytes);
  87. try
  88. {
  89. clientRichTextBox.AppendText(s + "\n");
  90. }
  91. catch (Exception exc) { }
  92. data.ServerConnection.Send(Encoding.UTF8.GetBytes("Сервер: соединен"));
  93. RunChat = true;
  94. }
  95. }
  96. public IPAddress GetAddress(string address)
  97. {
  98. IPAddress ipAddress = null;
  99. try
  100. {
  101. ipAddress = IPAddress.Parse(address);
  102. }
  103. catch (Exception)
  104. {
  105. IPHostEntry heserver;
  106. try
  107. {
  108. heserver = Dns.GetHostEntry(address);
  109. if (heserver.AddressList.Length == 0)
  110. {
  111. return null;
  112. }
  113. ipAddress = heserver.AddressList[0];
  114. }
  115. catch
  116. {
  117. return null;
  118. }
  119. }
  120. return ipAddress;
  121. }
  122. private void timerServer_Tick(object sender, EventArgs e)
  123. {
  124. if (RunChat)
  125. {
  126. try
  127. {
  128. server.Listen(100);
  129. }
  130. catch (Exception exc)
  131. {
  132. MessageBox.Show("Ошибка прослушивания: " + exc.Message);
  133. RunChat = false;
  134. return;
  135. }
  136. server.BeginAccept(new AsyncCallback(AsyncAcceptCallback), server);
  137. RunChat = false;
  138. }
  139. }
  140. }
  141. class SocketData
  142. {
  143. public const int BufferSize = 1024;
  144. public Socket ServerConnection { get; set; }
  145. byte[] buffer = new byte[BufferSize];
  146. public byte[] Buffer
  147. {
  148. get { return buffer; }
  149. set { buffer = value; }
  150. }
  151. }
  152. }
Вот код клиента:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Net;
  9. using System.Net.Sockets;
  10. using System.Diagnostics;
  11. namespace SocketClient
  12. {
  13. public partial class Form1 : Form
  14. {
  15. Socket client = null;
  16. int id = 0;
  17. public Form1()
  18. {
  19. InitializeComponent();
  20. }
  21. private void connectButton_Click(object sender, EventArgs e)
  22. {
  23. if (client != null && client.Connected)
  24. client.Disconnect(false);
  25. IPAddress addr = GetAddress(serverAddressTextBox.Text);
  26. if (addr == null)
  27. {
  28. MessageBox.Show("Я в шоке, не смог разобрать адрес");
  29. return;
  30. }
  31. int port = 12345;
  32. if (portTextBox.Text != "")
  33. port = Convert.ToInt32(portTextBox.Text);
  34. else
  35. MessageBox.Show("используется порт по умолчанию: 12345");
  36. client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  37. EndPoint point = new IPEndPoint(addr, port);
  38. try
  39. {
  40. client.Connect(point);
  41. }
  42. catch (Exception exc)
  43. {
  44. MessageBox.Show("Ошибка соединения: " + exc.Message);
  45. }
  46. if (client.Connected)
  47. {
  48. MessageBox.Show("Подключен!");
  49. }
  50. this.id = Convert.ToInt32(textBoxID.Text);
  51. client.Send(Encoding.UTF8.GetBytes("ID: " + this.id.ToString() + " Password: " + textBoxPassword.Text + " - Подключен!"));
  52. byte[] buffer = new byte[1024];
  53. int bytes = 0;
  54. try
  55. {
  56. bytes = client.Receive(buffer);
  57. }
  58. catch (Exception exc)
  59. {
  60. MessageBox.Show("Ошибка подключения: " + exc.Message);
  61. }
  62. if (bytes > 0)
  63. {
  64. string s = Encoding.UTF8.GetString(buffer, 0, bytes);
  65. clientRichTextBox.AppendText(s + "\n");
  66. }
  67. }
  68. void AsyncAcceptCallback(IAsyncResult result)
  69. {
  70. Socket serverSocket = (Socket)result.AsyncState;
  71. SocketData data = new SocketData();
  72. data.ClientConnection = serverSocket.EndAccept(result);
  73. data.ClientConnection.BeginReceive(data.Buffer, 0, 1024, SocketFlags.None,
  74. new AsyncCallback(ReadCallback), data);
  75. }
  76. void ReadCallback(IAsyncResult result)
  77. {
  78. SocketData data = (SocketData)result.AsyncState;
  79. int bytes = data.ClientConnection.EndReceive(result);
  80. if (bytes > 0)
  81. {
  82. string s = Encoding.UTF8.GetString(data.Buffer, 0, bytes);
  83. try
  84. {
  85. clientRichTextBox.AppendText(s + "\n");
  86. }
  87. catch (Exception exc)
  88. { }
  89. data.ClientConnection.Send(Encoding.UTF8.GetBytes("ID: " + this.id.ToString() + "Получено!"));
  90. }
  91. }
  92. public IPAddress GetAddress(string address)
  93. {
  94. IPAddress ipAddress = null;
  95. try
  96. {
  97. ipAddress = IPAddress.Parse(address);
  98. }
  99. catch (Exception)
  100. {
  101. IPHostEntry heserver;
  102. try
  103. {
  104. heserver = Dns.GetHostEntry(address);
  105. if (heserver.AddressList.Length == 0)
  106. {
  107. return null;
  108. }
  109. ipAddress = heserver.AddressList[0];
  110. }
  111. catch
  112. {
  113. return null;
  114. }
  115. }
  116. return ipAddress;
  117. }
  118. private void sendButton_Click(object sender, EventArgs e)
  119. {
  120. if (client != null && client.Connected)
  121. client.Disconnect(false);
  122. IPAddress addr = GetAddress(serverAddressTextBox.Text);
  123. if (addr == null)
  124. {
  125. MessageBox.Show("Я в шоке, не смог разобрать адрес");
  126. return;
  127. }
  128. int port = 12345;
  129. if (portTextBox.Text != "")
  130. port = Convert.ToInt32(portTextBox.Text);
  131. client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  132. EndPoint point = new IPEndPoint(addr, port);
  133. try
  134. {
  135. client.Connect(point);
  136. }
  137. catch (Exception exc)
  138. {
  139. MessageBox.Show("Ошибка соединения: " + exc.Message);
  140. }
  141. try
  142. {
  143. client.Send(Encoding.UTF8.GetBytes("ID: " + this.id.ToString() + " Сообщение: " + commandTextBox.Text));
  144. }
  145. catch (Exception exc)
  146. {
  147. MessageBox.Show("Ошибка отправки: " + exc.Message);
  148. }
  149. byte[] buffer = new byte[1024];
  150. int bytes = 0;
  151. try
  152. {
  153. bytes = client.Receive(buffer);
  154. }
  155. catch (Exception exc)
  156. {
  157. MessageBox.Show("Ошибка получения уведомления об отправке: " + exc.Message);
  158. }
  159. if (bytes > 0)
  160. {
  161. string s = Encoding.UTF8.GetString(buffer, 0, bytes);
  162. try
  163. {
  164. clientRichTextBox.AppendText(s + "\n");
  165. }
  166. catch (Exception exc)
  167. {}
  168. }
  169. }
  170. }
  171. class SocketData
  172. {
  173. public const int BufferSize = 1024;
  174. public Socket ClientConnection { get; set; }
  175. byte[] buffer = new byte[BufferSize];
  176. public byte[] Buffer
  177. {
  178. get { return buffer; }
  179. set { buffer = value; }
  180. }
  181. }
  182. }
иногда все работает, но иногда ...

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

textual
Листинг программы
  1. using System.Threading;
  2.  
  3.         void StartServer()
  4.         {
  5.             while (this.IsActive)
  6.             {
  7.                 if(this.IsEnable)
  8.                     if (this.RunChat)
  9.                     {
  10.                         try
  11.                         {
  12.                             server.Listen(100);
  13.                         }
  14.                         catch (Exception exc)
  15.                         {
  16.                             MessageBox.Show("Ошибка прослушивания: " + exc.Message);
  17.                             RunChat = false;
  18.                             return;
  19.                         }
  20.  
  21.                         server.BeginAccept(new AsyncCallback(AsyncAcceptCallback), server);
  22.                         RunChat = false;
  23.                     }
  24.                 Thread.Sleep(50);
  25.             }
  26.         }
  27.  
  28.         private void startServerButton_Click(object sender, EventArgs e)
  29.         {
  30.             if (!this.IsActive)
  31.             {
  32.                 if (server != null && server.Connected)
  33.                     server.Disconnect(false);
  34.  
  35.                 int port = 12345;
  36.                 if (portTextBox.Text != "")
  37.                     port = Convert.ToInt32(portTextBox.Text);
  38.                 else
  39.                     MessageBox.Show("используется порт по умолчанию: 12345");
  40.  
  41.  
  42.                 server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  43.                 EndPoint endPoint = new IPEndPoint(IPAddress.Any, port);
  44.  
  45.                 try
  46.                 {
  47.                     server.Bind(endPoint);
  48.                     //server.Listen(100);
  49.                 }
  50.                 catch (Exception exc)
  51.                 {
  52.                     MessageBox.Show("Невозможно запустить сервер " + exc.Message);
  53.                     return;
  54.                 }
  55.  
  56.                 this.RunChat = true;//для приема нового сообщения
  57.                 this.IsActive = true;//для работы потока
  58.                 this.IsEnable = true;//для временного прерывания\возобновления потока, при этом данные на сокете, ожидающие принятия программой не пропадают
  59.  
  60.                 myThread = new Thread(new ThreadStart(StartServer));
  61.                 myThread.Start();
  62.             }
  63.         }
  64. //...

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


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

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

13   голосов , оценка 3.538 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы