Блок-схема чата по локалке
Код:
namespace Chat1
{
public partial class Чат : Form
{
private void IP_Enter(object sender, EventArgs e)
{
if (IP.Text == (String)IP.Tag)
{
IP.Text = "";
}
}
private void IP_Leave(object sender, EventArgs e)
{
if (String.IsNullOrWhiteSpace(IP.Text))
{
IP.Text = "";
}
}
public Чат()
{
InitializeComponent();
new Thread(new ThreadStart(Receiver)).Start(); //Создание потока для приема сообщений
list.Items.AddRange(File.ReadAllLines(@"C:name.txt"));
}
void SetTextSafe(string newText)
{
if (IP.InvokeRequired) IP.Invoke(new Action<string>((s) => IP.Text = s), newText);
else IP.Text = newText;
}
protected void Receiver() //Метод потока
{
TcpListener Listen = new TcpListener(7000); //Создание Listener на порт "по умолчанию"
Listen.Start(); //Начинается прослушка
Socket ReceiveSocket; //заводится сокет
while (true)
{
try
{
ReceiveSocket = Listen.AcceptSocket(); //Сообщение пришло
Byte[] Receive = new Byte[256];
using (MemoryStream MessageR = new MemoryStream()) //Чтение сообщения через поток?
{
Int32 ReceivedBytes; //Количество считанных байт
do
{
ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0); //Чтение
MessageR.Write(Receive, 0, ReceivedBytes); //записание в потом (после чтения)
}
while (ReceiveSocket.Available > 0); //Читаем до тех пор, пока в очереди не останется данных
ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Он: " + Encoding.Default.GetString(MessageR.ToArray()), ChatBox }); //Добавление данных в ChatBox
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
//Отправляет сообщение в потоке на IP, заданный в контроле IP
void ThreadSend(object Message)
{
try
{
String MessageText = ""; //Проверяет входной объект на соответствие строки
if (Message is String)
MessageText = Message as String;
else
throw new Exception("Поле не должно остаться пустым...");
IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP.Text), 7000); //Создание сокета (присоединение)
Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Connector.Connect(EndPoint);
Byte[] SendBytes = Encoding.Default.GetBytes(MessageText); //Отправляется сообщение
Connector.Send(SendBytes);
Connector.Close();
ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Я: " + MessageText, ChatBox }); //Изменение поля сообщений (уведомление, что отправлено)
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
delegate void SendMsg(String Text, RichTextBox Rtb); //Делегат доступа к контролам формы
SendMsg AcceptDelegate = (String Text, RichTextBox Rtb) => //переменная данного класса (класса делегата)
{
Rtb.Text += Text + "n";
};
private void Send_Click_1(object sender, EventArgs e) //Обработчик кнопки
{
new Thread(new ParameterizedThreadStart(ThreadSend)).Start(Message.Text);
}
private void button3_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
}
{
public partial class Чат : Form
{
private void IP_Enter(object sender, EventArgs e)
{
if (IP.Text == (String)IP.Tag)
{
IP.Text = "";
}
}
private void IP_Leave(object sender, EventArgs e)
{
if (String.IsNullOrWhiteSpace(IP.Text))
{
IP.Text = "";
}
}
public Чат()
{
InitializeComponent();
new Thread(new ThreadStart(Receiver)).Start(); //Создание потока для приема сообщений
list.Items.AddRange(File.ReadAllLines(@"C:name.txt"));
}
void SetTextSafe(string newText)
{
if (IP.InvokeRequired) IP.Invoke(new Action<string>((s) => IP.Text = s), newText);
else IP.Text = newText;
}
protected void Receiver() //Метод потока
{
TcpListener Listen = new TcpListener(7000); //Создание Listener на порт "по умолчанию"
Listen.Start(); //Начинается прослушка
Socket ReceiveSocket; //заводится сокет
while (true)
{
try
{
ReceiveSocket = Listen.AcceptSocket(); //Сообщение пришло
Byte[] Receive = new Byte[256];
using (MemoryStream MessageR = new MemoryStream()) //Чтение сообщения через поток?
{
Int32 ReceivedBytes; //Количество считанных байт
do
{
ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0); //Чтение
MessageR.Write(Receive, 0, ReceivedBytes); //записание в потом (после чтения)
}
while (ReceiveSocket.Available > 0); //Читаем до тех пор, пока в очереди не останется данных
ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Он: " + Encoding.Default.GetString(MessageR.ToArray()), ChatBox }); //Добавление данных в ChatBox
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
//Отправляет сообщение в потоке на IP, заданный в контроле IP
void ThreadSend(object Message)
{
try
{
String MessageText = ""; //Проверяет входной объект на соответствие строки
if (Message is String)
MessageText = Message as String;
else
throw new Exception("Поле не должно остаться пустым...");
IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP.Text), 7000); //Создание сокета (присоединение)
Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Connector.Connect(EndPoint);
Byte[] SendBytes = Encoding.Default.GetBytes(MessageText); //Отправляется сообщение
Connector.Send(SendBytes);
Connector.Close();
ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Я: " + MessageText, ChatBox }); //Изменение поля сообщений (уведомление, что отправлено)
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
delegate void SendMsg(String Text, RichTextBox Rtb); //Делегат доступа к контролам формы
SendMsg AcceptDelegate = (String Text, RichTextBox Rtb) => //переменная данного класса (класса делегата)
{
Rtb.Text += Text + "n";
};
private void Send_Click_1(object sender, EventArgs e) //Обработчик кнопки
{
new Thread(new ParameterizedThreadStart(ThreadSend)).Start(Message.Text);
}
private void button3_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
}