Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППуКМ / Labs 1-7 / Лабораторна робота №7.doc
Скачиваний:
14
Добавлен:
18.03.2016
Размер:
177.15 Кб
Скачать

Лабораторна робота №7

Клієнт і сервер C# з використанням TcpListener і TcpClient

  1. Хід виконання роботи

    1. Синхронний режим

      1. Створюємо додаток типу Windows Forms Application з іменем, наприклад, WindowsFormsApplication1.

      1. Проектуємо інтерфейс та іменуємо змінні:

      1. Підключаємо простори імен:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Net.Sockets;

using System.Net;

using System.Threading;

      1. У класі Form1 створюємо змінні сокетів і потоку:

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

TcpClient tcpClient=null;

TcpListener tcpListener=null;

      1. У конструкторі задаємо:

public Form1()

{

InitializeComponent();

tPort.Text = "8080";

tAddr.Text = "127.0.0.1";

}

      1. Створюємо обробники на кліки для радіокнопок і в них пишемо:

private void rServer_Click(object sender, EventArgs e)

{

butLSN.Text = "Слушать";

}

private void rClient_Click(object sender, EventArgs e)

{

butLSN.Text = "Соединить";

}

      1. Створюємо обробник на клік для кнопки butLSN і в ньому пишемо:

private void butLSN_Click(object sender, EventArgs e)

{

if (rServer.Checked == true)

{

tcpListener = new TcpListener(IPAddress.Parse(tAddr.Text),int.Parse(tPort.Text));

tcpListener.Start();

tcpClient = tcpListener.AcceptTcpClient();

tcpListener.Stop();

}

else if (rClient.Checked == true)

{

tcpClient = new TcpClient();

tcpClient.Connect(IPAddress.Parse(tAddr.Text), int.Parse(tPort.Text));

}

}

      1. Створюємо обробник на клік для кнопки butSend і в ньому пишемо:

private void butSend_Click(object sender, EventArgs e)

{

byte [] bufSend=Encoding.ASCII.GetBytes(tSMsg.Text);

tcpClient.GetStream().Write(bufSend, 0, bufSend.Length);

}

      1. Створюємо обробник на клік для кнопки butRecv і в ньому пишемо:

private void butRecv_Click_1(object sender, EventArgs e)

{

byte[] bufRead = new byte[1024];

int kilkR=tcpClient.GetStream().Read(bufRead, 0, 1024);

bufRead[kilkR]=0;

tRMsg.Text = Encoding.ASCII.GetString(bufRead);

}

}

}

    1. Асинхронний режим

      1. Створюємо додаток типу Windows Forms Application з іменем, наприклад, WindowsFormsApplication2.

      1. Проектуємо інтерфейс та іменуємо змінні:

rServer

rClient

tAddr

tSMsg

bSend

tRMsg

      1. Підключаємо простори імен:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Net;

using System.Net.Sockets;

using System.Threading;

namespace WindowsFormsApplication2

{

      1. У класі Form1 створюємо змінні сокетів і потоку:

public partial class Form1 : Form

{

TcpListener listener=null;

TcpClient client=null;

Thread thr=null;

      1. У конструкторі задаємо:

public Form1()

{

InitializeComponent();

tAddr.Text = "127.0.0.1";

tPort.Text = "8080";

}

      1. Створюємо обробники на кліки для радіокнопок і в них пишемо:

private void rServer_Click(object sender, EventArgs e)

{

bLsn.Text = "Слушать";

}

private void rClient_Click(object sender, EventArgs e)

{

bLsn.Text = "Соединить";

}

      1. Створюємо обробник на клік для кнопки bLsn і в ньому пишемо:

private void bLsn_Click(object sender, EventArgs e)

{

if (rServer.Checked == true)

{

listener = new TcpListener(IPAddress.Parse(tAddr.Text), int.Parse(tPort.Text));

listener.Start();

client = listener.AcceptTcpClient();

listener.Stop();

}

else if (rClient.Checked == true)

{

client = new TcpClient();

client.Connect(IPAddress.Parse(tAddr.Text), int.Parse(tPort.Text));

}

thr = new Thread(Reading);

thr.Start();

}

      1. Створюємо функцію оберненого виклику для потоку читання і в ній пишемо:

void Reading()

{

byte[] bufR = new byte[1024];

int kilkR=0;

do

{

kilkR = client.GetStream().Read(bufR, 0, bufR.Length);

bufR[kilkR] = 0;

PrintRecivedText(Encoding.ASCII.GetString(bufR));

}

while(kilkR!=0);

}

      1. Створюємо делегат для подальшого запису тексту з потоку у компоненту вікна:

delegate void d(string s);

      1. Створюємо функцію для запису тексту з потоку у компоненту вікна і в ній пишемо:

void PrintRecivedText(string str)

{

if (tRMsg.InvokeRequired)

this.Invoke(new d(PrintRecivedText), str);

else

tRMsg.Text = str;

}

      1. Створюємо обробник на клік для кнопки bSend і в ньому пишемо:

private void bSend_Click(object sender, EventArgs e)

{

byte [] bufW=new byte[1024];

bufW=Encoding.ASCII.GetBytes(tSMsg.Text);

client.GetStream().Write(bufW, 0, bufW.Length);

}

      1. Створюємо обробник на закриття вікна і в ньому пишемо:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

if (listener != null)

listener.Server.Close();

if (client != null)

{

client.Client.Disconnect(false);

client.Client.Shutdown(SocketShutdown.Both);

client.Close();

}

if(thr != null)

thr.Abort();

}

}

}