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