27
Низкоуровневые операции в ИС. Сокеты в C#

Низкоуровневые операции в ИС. Сокеты в C#

  • Upload
    noah

  • View
    73

  • Download
    1

Embed Size (px)

DESCRIPTION

Низкоуровневые операции в ИС. Сокеты в C#. Понятие сокета. - PowerPoint PPT Presentation

Citation preview

Page 1: Низкоуровневые операции в ИС. Сокеты в  C#

Низкоуровневые операции в ИС. Сокеты в C#

Page 2: Низкоуровневые операции в ИС. Сокеты в  C#

Понятие сокетаЕсли требуется получить доступ к сетевым

операциям низкого уровня, в программе следует использовать класс Socket. Протокол TCP/IP (базовый протокол сети Internet) основывается на соединениях, устанавливаемых между двумя компьютерами, обычно называемых клиентом и сервером.

Множество приложений для Internet базируются на использовании протокола TCP/IP. Протокол TCP/IP построен на основе использования сетевых соединений – соединение сначала должно быть установлено, затем осуществляется передача данных, после чего оно разрывается.

Page 3: Низкоуровневые операции в ИС. Сокеты в  C#

Понятие сокетаСокеты TCP являются важным понятием в

программировании. С их помощью разработчик может создавать свои прикладные протоколы, отличные от HTTP и FTP.

Сокеты (socket) – это описатель сетевого соединения с другим приложением. Сокет TCP использует протокол TCP, наследуя все свойства этого протокола. Для создания TCP необходима следующая информация:

IP-адрес локальной машины; Номер порта TCP, который использует приложение

на локальной машине; IP-адрес машины, с которой устанавливается связь; Номер порта TCP, на который отзывается

приложение, ожидающее установления связи.

Page 4: Низкоуровневые операции в ИС. Сокеты в  C#

Сокеты в C#Язык C# поддерживает два типа

сетевых соединений: серверные, реализуемые с

помощью объектов класса TcpListener;

клиентские, реализуемые с помощью объектов класса TcpClient.

Page 5: Низкоуровневые операции в ИС. Сокеты в  C#

Программа - серверПрограмма – сервер выполняет

следующие шаги: Ожидание подключения клиента; Установка соединения с клиентом; Отправка/получение от клиента

сообщения; Разрыв соединения и завершение

программы.

Page 6: Низкоуровневые операции в ИС. Сокеты в  C#

Программа-серверНеобходимо понимать, что серверные приложения

запускаются на локальном компьютере. В качестве параметра конструктор класса TcpListener принимается номер порта, который впоследствии и будет прослушиваться программой.

Однако объект класса TcpListener позволяет только прослушивать определенный порт компьютера. Любые процессы передачи данных через этот сокет осуществляются с использованием объекта TcpClient. Ообъект TcpClient возвращается методом AcceptTcpClient() класса TcpListener, что обеспечивает сам процесс прослушивания порта.

Page 7: Низкоуровневые операции в ИС. Сокеты в  C#

СерверПри создании серверного приложения следует

подключить модули:using System.Net;using System.Net.Sockets;

Затем использовать класс TcpListener. Объекты этого класса связываются с заданным портом.

Int32 port = 13000;IPAddress localAddr = IPAddress.Parse("127.0.0.1");TcpListener server = new TcpListener(localAddr, port);server.Start();

Page 8: Низкоуровневые операции в ИС. Сокеты в  C#

СерверПосле связывания программы с портом с

помощью вызова метода AcceptTcpClient() можно подключиться к этому порту и начать прослушивание входящих соединений:

TcpClient client = server.AcceptTcpClient(); После подключения создается поток

входных/выходных сообщений:NetworkStream stream = client.GetStream();

Page 9: Низкоуровневые операции в ИС. Сокеты в  C#

Чтение сообщенийЧерез сокет передается массив байт,

который после получения нужно преобразовать в строку.

Byte[] bytes = new Byte[256];String data = null;int i = stream.Read(bytes, 0,

bytes.Length);data=System.Text.Encoding.UTF8.GetString(bytes, 0, i);

Page 10: Низкоуровневые операции в ИС. Сокеты в  C#

Отправка сообщенийПеред отправкой через сокет строку

необходимо преобразовать в массив байт.

Byte[] bytes = new Byte[256];String data = “text”;bytes =System.Text.Encoding.UTF.GetBytes(data);stream.Write(bytes, 0, bytes.Length);

Page 11: Низкоуровневые операции в ИС. Сокеты в  C#

Фрагмент программы-сервераtry{

Int32 port = 13200;IPAddress localAddr = IPAddress.Parse("127.0.0.1");

//создание и запуск сервера TcpListener server = new TcpListener(localAddr, port);server.Start();Byte[] bytes = new Byte[256];String data = null;

Page 12: Низкоуровневые операции в ИС. Сокеты в  C#

Фрагмент программы-сервераwhile(true)

{ //прослушивание порта и ожидание

подключенияTcpClient client = server.AcceptTcpClient();data = null;

//произошло подключение, создается поток сообщенийNetworkStream stream = client.GetStream();

Page 13: Низкоуровневые операции в ИС. Сокеты в  C#

Фрагмент программы-сервера// чтение сообщения

int i = stream.Read(bytes, 0, bytes.Length);data = System.Text.Encoding.UTF8.GetString(bytes, 0, i);

//преобразование данныхdata = data.ToUpper();

//отправка сообщенияbyte[] msg = System.Text.Encoding.UTF8.GetBytes(data);stream.Write(msg, 0, msg.Length);

Page 14: Низкоуровневые операции в ИС. Сокеты в  C#

Фрагмент программы-сервера//завершение работы с потоком сообщенийclient.Close();

}//end while}// end trycatch(SocketException ex){

// ошибки соединения}

Page 15: Низкоуровневые операции в ИС. Сокеты в  C#

Программа-клиентПрограмма-клиент выполняет

следующие действия: Подключение к серверу. Отправка/получение сообщения от

сервера. Отображение полученного

сообщения пользователю. Разрыв соединения с сервером.

Page 16: Низкоуровневые операции в ИС. Сокеты в  C#

Программа-клиентДля подключения к серверу используется

конструктор, параметрами которого служат IP-адрес серверной программы и порт, который сервер прослушивает:

TcpClient client = new TcpClient(server, port); Затем, после подключения к серверу,

аналогично серверной программе, создается поток входных/выходных сообщений:

NetworkStream stream = client.GetStream();

Page 17: Низкоуровневые операции в ИС. Сокеты в  C#

Программа-клиентМожно отправить сообщение серверу,

предварительно преобразовав строку в массив байт:

Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(message);

stream.Write(bytes, 0, bytes.Length); Или получить сообщение от сервера, преобразовав

массив байт в строку:bytes = new Byte[256];String responseData = String.Empty;Int32 i = stream.Read(bytes, 0, bytes.Length);responseData =

System.Text.Encoding.ASCII.GetString(bytes, 0, i);

Page 18: Низкоуровневые операции в ИС. Сокеты в  C#

Фрагмент программы-клиентаvoid Connect(String server, String message, Int32 port) {try

{// Подключение к серверу

TcpClient client = new TcpClient(server, port); // Создание потока сообщений

NetworkStream stream = client.GetStream();// Отправка сообщения

Byte[] bytes = System.Text.Encoding.ASCII.GetBytes(message);stream.Write(bytes, 0, bytes.Length);

Page 19: Низкоуровневые операции в ИС. Сокеты в  C#

Фрагмент программы-клиентаbytes = new Byte[256];String responseData = String.Empty;// получение сообщенияInt32 i = stream.Read(bytes, 0, bytes.Length);responseData =

System.Text.Encoding.UTF8.GetString(bytes, 0, i);client.Close();

} catch (Exception e) {

// ошибка соединения}

}// end connection

Page 20: Низкоуровневые операции в ИС. Сокеты в  C#

Фрагмент программы-клиента

Пример соединения с программой-сервером.

Connect(“localhost”,”text”,13000);

Connect(“192.168.112.1”,”text”,13200);

Page 21: Низкоуровневые операции в ИС. Сокеты в  C#

Подключение к БД в программе-сервереtry{

this.odbcConnection1.Open();// использование полученного от клиента сообщения в

качестве параметра запроса

this.odbcCommand1.Parameters["p1"].Value=data;rdr=this.odbcCommand1.ExecuteReader();

}catch(Exception exx)

{…}

Page 22: Низкоуровневые операции в ИС. Сокеты в  C#

Подключение к БД в программе-сервереwhile(rdr.Read()) // подсчет количества записей{ rw++; }

rdr.Close();data=rw.ToString();

// отправка клиенту количества записейbyte[] msg =

System.Text.Encoding.ASCII.GetBytes(data);stream.Write(msg, 0, msg.Length);rdr=this.odbcCommand1.ExecuteReader();data=result;

Page 23: Низкоуровневые операции в ИС. Сокеты в  C#

//определение количества полей в записиdata=rdr.FieldCount.ToString();

// отправка клиенту количества полей в записи

msg = System.Text.Encoding.ASCII.GetBytes(data);stream.Write(msg, 0, msg.Length);

Page 24: Низкоуровневые операции в ИС. Сокеты в  C#

Отправка клиенту результата запросаwhile (rdr.Read()){

data=rdr["tovar"].ToString();msg = System.Text.Encoding.ASCII.GetBytes(data);stream.Write(msg, 0, msg.Length);

data=rdr["tip"].ToString();msg = System.Text.Encoding.ASCII.GetBytes(data);stream.Write(msg, 0, msg.Length);

}

Page 25: Низкоуровневые операции в ИС. Сокеты в  C#

Получение результата в программе клиента//Получение от сервера числа записейByte[] data2 = new Byte[256];Int32 bytes2 = stream.Read(data2, 0, data2.Length);int rw=Convert.ToInt32(System.Text.Encoding.ASCII.GetString(d

ata2, 0, bytes2));

// Получение от сервера количества полей в записиByte[] data1 = new Byte[256];Int32 bytes1 = stream.Read(data1, 0, data1.Length);int col=Convert.ToInt32(System.Text.Encoding.ASCII.GetString(d

ata1, 0, bytes1));

Page 26: Низкоуровневые операции в ИС. Сокеты в  C#

// Получение от сервера набора данныхfor (int j=1;j<=rw;j++){

DataRow r=this.dataSet1.Tables[0].NewRow();for (int i=0;i<col;i++){bytes = stream.Read(data, 0, data.Length);responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);Console.WriteLine("Received: {0}", responseData); r[i]=responseData;}this.dataSet1.Tables[0].Rows.Add(r);

}

Page 27: Низкоуровневые операции в ИС. Сокеты в  C#

Отображение данных в программе-клиентеConnect(this.textBox2.Text,this.textBox1.

Text,13000);Connect(this.textBox2.Text,this.textBox1.

Text,13200);

this.dataGrid1.SetDataBinding(this.dataSet1,"Table1");