Приложение tcp/ip, прикладной протокол - C#
Формулировка задачи:
Здравствуйте, у меня появилось задание, где нужно разработать прикладной протокол для обмена текстовыми сообщениями на основе протокола TCP. Создать приложение, обеспечивающее передачу текстовых сообщений произвольному адресату в сети и их приём с указанием сетевого адреса отправителя с использованием протокола TCP. Приложение должно иметь возможность работать и как клиент, и как сервер.
Также нужно потом в отдельном приложении добавить возможность отправки файлов
Посоветуйте материалы, видео либо по сетевому программированию, так как в этой области я тупой,а лабораторную делать нужно. Все просмотренные мной материалы или видео, не то. В одних разделяют на 2 отдельных приложения(Клиент и сервер), в других не разрабатывают протокола.
Решение задачи: «Приложение tcp/ip, прикладной протокол»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ChatAppTCP
{
//структура пакета
//------------------------------
//Описание -> |DataIdentifier|name length|message length|name |message |
//Размер в байтах->| 4 | 4 | 4 | name lenght| message length|
public enum DataIdentifier
{
Message,
LogIn,
LogOut,
Null
}
public class Packet
{
#region Поля
private DataIdentifier dataidentifier;
private string name;
private string message;
#endregion
#region Свойства
public DataIdentifier ChatDataIdentifier
{
get { return dataidentifier; }
set { dataidentifier = value; }
}
public string ChatName
{
get { return name; }
set { name = value; }
}
public string ChatMessage
{
get { return message; }
set { message = value; }
}
#endregion
#region Методы
// Конструктор по умолчанию
public Packet()
{
this.dataidentifier = DataIdentifier.Null;
this.message = null;
this.name = null;
}
public Packet(byte[] dataStream)
{
//Чтение идентификатора данных от начала потока(4 байта)
this.dataidentifier = (DataIdentifier)BitConverter.ToInt32(dataStream, 0);
//Чтение длины имени(4 байта)
int nameLenght = BitConverter.ToInt32(dataStream, 4);
//чтение длины сообщения(4 байта)
int messageLenght = BitConverter.ToInt32(dataStream, 8);
//чтение имени
if (nameLenght > 0)
this.name = Encoding.UTF8.GetString(dataStream, 12, nameLenght);
else
this.message = null;
//чтение сообщения
if (messageLenght > 0)
this.message = Encoding.UTF8.GetString(dataStream, 12 + nameLenght, messageLenght);
else
this.message = null;
}
//Конвертирование пакета в массив байтов для отправки/ получения
public byte[] GetDataStream()
{
List<byte> dataStream = new List<byte>();
//Добавление dataIdentifier
dataStream.AddRange(BitConverter.GetBytes((int)this.dataidentifier));
//Добавление длины имени
if (this.name != null)
dataStream.AddRange(BitConverter.GetBytes(this.name.Length));
else
dataStream.AddRange(BitConverter.GetBytes(0));
//Добавление имени
if (this.name != null)
dataStream.AddRange(Encoding.UTF8.GetBytes(this.name));
//Добавление сообщения
if (this.message != null)
dataStream.AddRange(Encoding.UTF8.GetBytes(this.message));
return dataStream.ToArray();
}
#endregion
}
}