Лабораторна робота №7
Клієнт і сервер C# з використанням TcpListener і TcpClient
-
Хід виконання роботи
-
Синхронний режим
-
Створюємо додаток типу Windows Forms Application з іменем, наприклад, WindowsFormsApplication1.
-
Проектуємо інтерфейс та іменуємо змінні:
-
Підключаємо простори імен:
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;
-
У класі Form1 створюємо змінні сокетів і потоку:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
TcpClient tcpClient=null;
TcpListener tcpListener=null;
-
У конструкторі задаємо:
public Form1()
{
InitializeComponent();
tPort.Text = "8080";
tAddr.Text = "127.0.0.1";
}
-
Створюємо обробники на кліки для радіокнопок і в них пишемо:
private void rServer_Click(object sender, EventArgs e)
{
butLSN.Text = "Слушать";
}
private void rClient_Click(object sender, EventArgs e)
{
butLSN.Text = "Соединить";
}
-
Створюємо обробник на клік для кнопки 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));
}
}
-
Створюємо обробник на клік для кнопки butSend і в ньому пишемо:
private void butSend_Click(object sender, EventArgs e)
{
byte [] bufSend=Encoding.ASCII.GetBytes(tSMsg.Text);
tcpClient.GetStream().Write(bufSend, 0, bufSend.Length);
}
-
Створюємо обробник на клік для кнопки 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);
}
}
}
-
Асинхронний режим
-
Створюємо додаток типу Windows Forms Application з іменем, наприклад, WindowsFormsApplication2.
-
Проектуємо інтерфейс та іменуємо змінні:
rServer
rClient
tAddr
tSMsg
bSend
tRMsg
-
Підключаємо простори імен:
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
{
-
У класі Form1 створюємо змінні сокетів і потоку:
public partial class Form1 : Form
{
TcpListener listener=null;
TcpClient client=null;
Thread thr=null;
-
У конструкторі задаємо:
public Form1()
{
InitializeComponent();
tAddr.Text = "127.0.0.1";
tPort.Text = "8080";
}
-
Створюємо обробники на кліки для радіокнопок і в них пишемо:
private void rServer_Click(object sender, EventArgs e)
{
bLsn.Text = "Слушать";
}
private void rClient_Click(object sender, EventArgs e)
{
bLsn.Text = "Соединить";
}
-
Створюємо обробник на клік для кнопки 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();
}
-
Створюємо функцію оберненого виклику для потоку читання і в ній пишемо:
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);
}
-
Створюємо делегат для подальшого запису тексту з потоку у компоненту вікна:
delegate void d(string s);
-
Створюємо функцію для запису тексту з потоку у компоненту вікна і в ній пишемо:
void PrintRecivedText(string str)
{
if (tRMsg.InvokeRequired)
this.Invoke(new d(PrintRecivedText), str);
else
tRMsg.Text = str;
}
-
Створюємо обробник на клік для кнопки 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);
}
-
Створюємо обробник на закриття вікна і в ньому пишемо:
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();
}
}
}
