Файл: Разработка клиентского и серверного приложения по организации чата с применением протокола TCP на платформе WIN 32.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.06.2023

Просмотров: 44

Скачиваний: 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("Заполните все поля!");}?}