Клиент-серверное приложение перстает работать при отправке/приеме 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();
}
}
//...