Файл: Разработка клиентского и серверного приложения по организации чата с применением протокола TCP на платформе WIN 32.pdf
Добавлен: 28.06.2023
Просмотров: 48
Скачиваний: 5
Рис. 9
private void выходToolStripMenuItem_Click_1(object sender, EventArgs e)
{
if (th != null) th.Abort();
if (Client != null)
{
Client.Close();
textBox2.Enabled = false;
button1.Enabled = false;
label5.Enabled = false;
listBox1.Items.Add("Вы вышли из чата...");
}
else listBox1.Items.Add("Вы ещё не зашли в чат!");
}
Функция отправки сообщения серверу выглядит следующим образом:
void SendMessage(string message)
{
if (message != " " && message != "")
{
byte[] buffer = new byte[1024];
buffer = Encoding.UTF8.GetBytes(message);
Client.Send(buffer);}}
Функция приёма сообщений от сервера:
void RegOfMessage()
{
byte[] buffer = new byte[1024];
for (int i = 0; i < buffer.Length; i++)
{ buffer[i] = 0; }
for (; ; )
{try{
Client.Receive(buffer);
string messege = Encoding.UTF8.GetString(buffer);
int count = messege.IndexOf("**8");
if (count == -1)
{ continue; }
string Clean_Mes = "";
for (int i = 0; i < count; i++)
{ Clean_Mes += messege[i]; }
for (int i = 0; i < buffer.Length; i++)
{ buffer[i] = 0; }
this.Invoke((MethodInvoker)delegate()
{ listBox1.Items.Add(Clean_Mes); });}
catch (Exception ex) { }
}}
Подключение клиента реализуется следующим образом:
Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
if (ip != null)
{
Client.Connect(ip, port);
th = new Thread(delegate() { RegOfMessage(); });
th.Start();
}
Заключение
В результате выполнения курсового проекта были разработаны следующие приложения: сервер и клиент. Также были решены все задачи и достигнута цель. Целью данной работы было разработать сетевое приложение. Данное приложение позволяет удалённо обмениваться информацией по локальной или беспроводной сети.
Были получены навыки и умения в следующих сферах:
· Программирование на языках C# и С++;
· Работа с сокетами;
· Применение протокола TCP;
· Использование потоков.
Представленная версия приложения является законченным программным продуктом. Однако она может быть доработана, для чего понадобятся дополнительные средства, а также время, в течение которого будут исправляться все недочеты, которые пропустил или не посчитал нужным реализовывать разработчик.
Данный программный продукт может быть использован как в домашних условия, так и в условиях производства.
В заключении хотелось бы отметить, что интерфейс на клиенте выполнен в наиболее удобном и простом варианте, что позволяет пользователю комфортно работать с приложением.
Список литературы
1. Брагин И. «Построение сетей» - СПб.: Питер, 2010. - 480 с.: ил.
2. Карпов Б., Баранов Т. «С++: специальный справочник» - СПб.: Питер, 2001. - 480 с.: ил.
3. Культин Н. «С# в задачах и примерах» - СПб.: БХВ-Петербург, 2002. - 288 с.
4. Петров Б., Алексеев Т. «С#» - Москва, 2011. - 370 с.: ил.
5. Шилдт Г. «Самоучитель С#» - СПб.: БХВ-Петербург. 2001. - 670с.
Приложение
My_Server.cpp:
#pragma comment(lib,"Ws2_32.lib")
#include <WinSock2.h>
#include <iostream>
#include <WS2tcpip.h>
SOCKET Connect;
SOCKET* Connections;
SOCKET Listen;
int ClientCount = 0;
void SendMessageToClient(int ID)
{
char* buffer = new char[1024];
for (;; Sleep(100))
{
memset(buffer, 0, sizeof(buffer));
if (recv(Connections[ID], buffer, 1024, NULL))
{
printf("%s", buffer);
for (int i = 0; i <= ClientCount; i++)
{
send(Connections[i], buffer, strlen(buffer), NULL);
}
}
}
free(buffer);
}
int main()
{
setlocale(LC_ALL, "russian");
WSAData data;
WORD version = MAKEWORD(2, 2);
int res = WSAStartup(version, &data);
if (res != 0)
{
return 0;
}
struct addrinfo server;
struct addrinfo * result;
Connections = (SOCKET*)calloc(64, sizeof(SOCKET));
ZeroMemory(&server, sizeof(server));
server.ai_family = AF_INET;
server.ai_flags = AI_PASSIVE;
server.ai_socktype = SOCK_STREAM;
server.ai_protocol = IPPROTO_TCP;
getaddrinfo(NULL, "8888", &server, &result);
Listen = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
bind(Listen, result->ai_addr, result->ai_addrlen);
listen(Listen, SOMAXCONN);
freeaddrinfo(result);
char conect[] = "Connect...**8";
char kol[] = "All users: ";
printf("Server connect...\n");
printf(kol);
printf("%d", ClientCount);
for (;; Sleep(100))
{
if (Connect = accept(Listen, NULL, NULL))
{
printf("\nClient connect...\n");
printf(kol);
printf("%d", ClientCount + 1);
Connections[ClientCount] = Connect;
send(Connections[ClientCount], conect, strlen(conect), NULL);
ClientCount++;
CreateThread(NULL, NULL, (PTHREAD_START_ROUTINE)SendMessageToClient, (LPVOID)(ClientCount - 1), NULL, NULL);
}
}
return 1;
}
MyChat_Client
Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.IO;
using System.Net;
using System.Threading;
namespace MyChat_Client
{
public partial class Form1 : Form
{
static private Socket Client;
private IPAddress ip = null;
private int port = 8888;
private string nik;
private Thread th;
public Form1()
{
InitializeComponent();
textBox2.Enabled = false;
button1.Enabled = false;
label5.Enabled = false;
try
{
var sr = new StreamReader(@"Chat_Info/nastroyki.txt");
string buffer = sr.ReadToEnd();
sr.Close();
string[] info = buffer.Split(':');
ip = IPAddress.Parse(info[0]);
nik = info[1];
label4.ForeColor = Color.Green;
label4.Text = " Подключение по IP сервера: " + info[0];
Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
if (ip != null)
{
Client.Connect(ip, port);
th = new Thread(delegate() { RegOfMessage(); });
th.Start();
button1.Enabled = true;
textBox2.Enabled = true;
label5.Enabled = true;
listBox1.Items.Add(nik + " присоединился!");
}
}
catch (Exception ex)
{
label4.ForeColor = Color.Red;
label4.Text = "Настройки не найдены\nВведите заново!";
button2.Visible = true;
}
}
void SendMessage(string message)
{
if (message != " " && message != "")
{
byte[] buffer = new byte[1024];
buffer = Encoding.UTF8.GetBytes(message);
Client.Send(buffer);
}
}
void RegOfMessage()
{
byte[] buffer = new byte[1024];
for (int i = 0; i < buffer.Length; i++)
{ buffer[i] = 0; }
for (; ; )
{
try
{
Client.Receive(buffer);
string messege = Encoding.UTF8.GetString(buffer);
int count = messege.IndexOf("**8");
if (count == -1)
{ continue; }
string Clean_Mes = "";
for (int i = 0; i < count; i++)
{ Clean_Mes += messege[i]; }
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = 0;
}
this.Invoke((MethodInvoker)delegate()
{
listBox1.Items.Add(Clean_Mes);
});
}
catch (Exception ex) { }
}
}
private void авторToolStripMenuItem_Click_1(object sender, EventArgs e)
{
MessageBox.Show("Булычёв Вячеслав \n ДБО - 481 \n 2015г");
}
private void button1_Click_1(object sender, EventArgs e)
{
SendMessage("\n" + nik + ": " + textBox2.Text + "**8");
textBox2.Clear();
}
private void textBox2_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
SendMessage("\n" + nik + ": " + textBox2.Text + "**8");
textBox2.Clear();
}?
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
this.Hide();
Form3 form = new Form3();
form.Show();
}
private void выходToolStripMenuItem_Click_1(object sender, EventArgs e)
{
if (th != null) th.Abort();
if (Client != null)
{
Client.Close();
textBox2.Enabled = false;
button1.Enabled = false;
label5.Enabled = false;
listBox1.Items.Add("Вы вышли из чата...");
}
else listBox1.Items.Add("Вы ещё не зашли в чат!");
}}}
Form3.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Windows.Forms;
namespace MyChat_Client
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text != " " && textBox1.Text != "" && textBox2.Text != " " && textBox2.Text != "")
{
try
{
DirectoryInfo data = new DirectoryInfo("Chat_Info");
data.Create();
var sw = new StreamWriter(@"Chat_Info/nastroyki.txt");
sw.WriteLine(textBox1.Text + ":" + textBox2.Text);
sw.Close();
this.Hide();
Form1 form = new Form1();
form.Show();}
catch (Exception ex)
{MessageBox.Show("Ошибка: " + ex.Message);}}
else MessageBox.Show("Заполните все поля!"); }
private void pictureBox1_Click(object sender, EventArgs e)
{
MessageBox.Show("Для начала общения с другими пользователями Вам необходимо ввести IP сервера и свой Ник, нажать кнопку ' Войти в чат! ' или кнопку ' Enter ', после чего вы сможете обмениваться сообщениями. Для выхода из чата нужно выбрать пункт ' Выход ' в меню, либо закрыть приложение");
}
private void textBox2_KeyDown(object sender, KeyEventArgs e)
{ if (e.KeyCode == Keys.Enter)
{
if (textBox1.Text != " " && textBox1.Text != "" && textBox2.Text != " " && textBox2.Text != "")
{ try
{ DirectoryInfo data = new DirectoryInfo("Chat_Info");
data.Create();
var sw = new StreamWriter(@"Chat_Info/nastroyki.txt");
sw.WriteLine(textBox1.Text + ":" + textBox2.Text);
sw.Close();
this.Hide();
Form1 form = new Form1();
form.Show();}
catch (Exception ex)
{MessageBox.Show("Ошибка: " + ex.Message);}}
else MessageBox.Show("Заполните все поля!");}?}