Difference between revisions of "Programmering III Experthold"
(→Torsdag) |
|||
(9 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
Mail: makn@mercantec.dk | Mail: makn@mercantec.dk | ||
+ | '' | ||
+ | Link til fantastisk bog:'' | ||
+ | |||
+ | https://drive.google.com/file/d/0B5oDizcmFQ1YZjlHcFE5c1NxREE/view?usp=sharing | ||
+ | |||
=Torsdag= | =Torsdag= | ||
Line 166: | Line 171: | ||
Se hvor langt du kan nå. Vi gennemgår løsningen på mandag. | Se hvor langt du kan nå. Vi gennemgår løsningen på mandag. | ||
+ | |||
+ | |||
+ | ===TCP:=== | ||
+ | |||
+ | TCP sender: | ||
+ | |||
+ | <source lang="Csharp"> | ||
+ | static TcpClient tcpClient; | ||
+ | static NetworkStream ns; | ||
+ | static IPEndPoint endPoint; | ||
+ | |||
+ | static void Main(string[] args) | ||
+ | { | ||
+ | tcpClient = new TcpClient("172.16.237.161", 11000); | ||
+ | ns = tcpClient.GetStream(); | ||
+ | |||
+ | for (int i = 1; i <= 100; i++) | ||
+ | { | ||
+ | byte[] bytesToSend = Encoding.ASCII.GetBytes(i.ToString() + "\n"); | ||
+ | ns.Write(bytesToSend, 0, bytesToSend.Length); | ||
+ | } | ||
+ | Console.ReadKey(); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | TCP listener: | ||
+ | |||
+ | <source lang="Csharp"> | ||
+ | static TcpListener tcpListener; | ||
+ | static TcpClient tcpClient; | ||
+ | static IPEndPoint endPoint; | ||
+ | static NetworkStream ns; | ||
+ | static Stopwatch sw; | ||
+ | static long milliseconds; | ||
+ | static int index = 0; | ||
+ | static bool run = true; | ||
+ | |||
+ | static Thread t; | ||
+ | |||
+ | //Listens for TCP data | ||
+ | static void Main(string[] args) | ||
+ | { | ||
+ | t = new Thread(ListenerThread); | ||
+ | sw = new Stopwatch(); | ||
+ | |||
+ | IPEndPoint ipEndPoint_any = new IPEndPoint(IPAddress.Any, 11000); | ||
+ | |||
+ | tcpListener = new TcpListener(ipEndPoint_any); | ||
+ | tcpClient = new TcpClient(); | ||
+ | tcpListener.Start(); | ||
+ | |||
+ | tcpClient = tcpListener.AcceptTcpClient(); | ||
+ | endPoint = (IPEndPoint)tcpClient.Client.RemoteEndPoint; | ||
+ | ns = tcpClient.GetStream(); | ||
+ | t.Start(); | ||
+ | |||
+ | Console.ReadKey(); | ||
+ | Console.WriteLine("I recived " + index + " number of packages out of 100."); | ||
+ | Console.WriteLine("It took " + milliseconds + " milliseconds in total"); | ||
+ | run = false; | ||
+ | t.Abort(); | ||
+ | Console.ReadKey(); | ||
+ | } | ||
+ | |||
+ | static void ListenerThread() | ||
+ | { | ||
+ | while (run) | ||
+ | { | ||
+ | if (ns.DataAvailable) | ||
+ | { | ||
+ | if (!sw.IsRunning) | ||
+ | { | ||
+ | sw.Start(); | ||
+ | } | ||
+ | byte[] recivedBytes = new byte[512]; | ||
+ | byte[] trimmedBytes; | ||
+ | int bytesRead = ns.Read(recivedBytes, 0, recivedBytes.Length); | ||
+ | trimmedBytes = new byte[bytesRead]; | ||
+ | Array.Copy(recivedBytes, trimmedBytes, bytesRead); | ||
+ | string result = Encoding.ASCII.GetString(trimmedBytes); | ||
+ | Console.Write(result); | ||
+ | milliseconds = sw.ElapsedMilliseconds; | ||
+ | index++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ''Opgave:'' | ||
+ | |||
+ | Lav et simpelt chatprogram der benytter TCP, hvor man både kan sende og modtage beskeder. | ||
+ | |||
+ | |||
+ | |||
+ | ===TCP Listener v2.0=== | ||
+ | |||
+ | <source lang="Csharp"> | ||
+ | class Listener | ||
+ | { | ||
+ | TcpListener tcpListener; | ||
+ | TcpClient tcpClient; | ||
+ | IPEndPoint endPoint; | ||
+ | bool run = true; | ||
+ | List<Thread> threadList = new List<Thread>(); | ||
+ | int port = 11000; | ||
+ | |||
+ | public Listener() | ||
+ | { | ||
+ | IPEndPoint ipEndPoint_any = new IPEndPoint(IPAddress.Any, port); | ||
+ | |||
+ | tcpListener = new TcpListener(ipEndPoint_any); | ||
+ | tcpClient = new TcpClient(); | ||
+ | tcpListener.Start(); | ||
+ | |||
+ | while (true) | ||
+ | { | ||
+ | if(tcpListener.Pending()) | ||
+ | { | ||
+ | Thread.Sleep(100); | ||
+ | Thread t = new Thread(ListenerThread); | ||
+ | t.Start(); | ||
+ | t.IsBackground = true; | ||
+ | threadList.Add(t); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void ListenerThread() | ||
+ | { | ||
+ | port++; | ||
+ | tcpClient = tcpListener.AcceptTcpClient(); | ||
+ | endPoint = (IPEndPoint)tcpClient.Client.RemoteEndPoint; | ||
+ | NetworkStream ns = tcpClient.GetStream(); | ||
+ | Console.WriteLine("TCP connection acceptet by thread."); | ||
+ | while (run) | ||
+ | { | ||
+ | if (ns.DataAvailable) | ||
+ | { | ||
+ | byte[] recivedBytes = new byte[512]; | ||
+ | byte[] trimmedBytes; | ||
+ | int bytesRead = ns.Read(recivedBytes, 0, recivedBytes.Length); | ||
+ | trimmedBytes = new byte[bytesRead]; | ||
+ | Array.Copy(recivedBytes, trimmedBytes, bytesRead); | ||
+ | string result = Encoding.ASCII.GetString(trimmedBytes); | ||
+ | Console.Write(result); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | ===XML:=== | ||
+ | |||
+ | Konverter en klasse til XML: | ||
+ | <source lang="Csharp"> | ||
+ | static void Main(string[] args) | ||
+ | { | ||
+ | Henry h = new Henry(); | ||
+ | |||
+ | Console.WriteLine("Money :" + h.money); | ||
+ | Console.WriteLine("Idears: " + h.idears); | ||
+ | Console.ReadKey(); | ||
+ | |||
+ | //XML | ||
+ | XmlSerializer serializer = new XmlSerializer(typeof(Henry)); | ||
+ | StringWriter sWriter = new StringWriter(); | ||
+ | serializer.Serialize(sWriter, h); | ||
+ | |||
+ | string myXML = sWriter.ToString(); | ||
+ | |||
+ | Console.WriteLine(myXML); | ||
+ | Console.ReadKey(); | ||
+ | |||
+ | //Konverter XML tilbage til en klasse: | ||
+ | Henry h2 = new Henry(); | ||
+ | StringReader sReader = new StringReader(myXML); | ||
+ | h2 = (Henry)serializer.Deserialize(sReader); | ||
+ | |||
+ | Console.WriteLine("Henry 2 money: " + h2.money); | ||
+ | Console.WriteLine("Henry 2 idears: " + h2.idears); | ||
+ | Console.ReadKey(); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | Henry klassen: | ||
+ | <source lang="Csharp"> | ||
+ | public class Henry | ||
+ | { | ||
+ | public float money = 1000; | ||
+ | public int idears = 0; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ===Opgave:=== | ||
+ | Konverter en klasse til XML og send den igennem en netværksforbindelse. Konverter da XML tilbage til en klasse på en anden computer. | ||
+ | |||
+ | |||
+ | ===Opgave med kryptering:=== | ||
+ | Lav et program med 2 funktioner {KrypterString, DekrypterString} | ||
+ | |||
+ | Programmet skal kunne kryptere en plan string til ulæselig tekst, og derefter kunne dekryptere det ulæselige tekst tilbage til plan tekst. | ||
+ | |||
+ | Implementer til sidst dette ind i jeres chatprogram. | ||
+ | |||
+ | |||
+ | ===Eksempel med interfaces:=== | ||
+ | https://drive.google.com/file/d/1nvg50p6XAFCT5H-eZSJlzPnSf3D6KDCV/view?usp=sharing | ||
+ | |||
+ | |||
+ | =Valg af opgave= | ||
+ | |||
+ | Du skal vælge et projekt som du skal arbejde med. | ||
+ | Projektet skal opfylde følgende krav: | ||
+ | |||
+ | • Projektet skal være objekt-orienteret. (Projektet skal som minimum indeholde klasser og objekter.) | ||
+ | |||
+ | • Projektet skal indeholde kommunikation igennem et netværk. (Brug gerne sockets) | ||
+ | |||
+ | • Projektet skal have fokus på tråde. | ||
+ | |||
+ | Eksempel på eksamensopgave: | ||
+ | https://drive.google.com/file/d/1UaeqLPVEFlnuAK8pw9GBS_uzGxgSzjat/view?usp=sharing |
Latest revision as of 11:00, 12 December 2017
Contents
Generelt:
Mail: makn@mercantec.dk Link til fantastisk bog:
https://drive.google.com/file/d/0B5oDizcmFQ1YZjlHcFE5c1NxREE/view?usp=sharing
Torsdag
Sådan importeres en .exe fil ind i et application domain:
static void Main(string[] args)
{
AppDomain appDomain = AppDomain.CreateDomain("New Domain");
appDomain.ExecuteAssembly("HelloWorld.exe");
}
Hent denne fil, og lav et program der bruteforcer kodeordet. kodeordetindeholder kun lowerCase bogstaver, som ikke indeholder æ, ø eller å (hint: kodeordet er "hot"):
Efter at du har hentet filen, højreklik da på den og vælg egnskaber/properties. Nederst i venstre hjørne er der et flueben som skal fjernes i "fjern blokering".
https://drive.google.com/file/d/1KuRDP74fuzuChf4RfFNq2E5pRw6MH2Wp/view?usp=sharing
Eksempel på kode:
static void Main(string[] args)
{
AppDomain encryptedFile = AppDomain.CreateDomain("New Appdomain");
string[] key = {"aaa"};
int success = encryptedFile.ExecuteAssembly("EncryptedFile.exe ", key);
if(sucess == 1)
{
Console.Writeline("Koden var korrekt");
}
else
{
Console.WriteLine("Koden var forkert");
}
Console.ReadKey();
}
Hjælpekode:
static void Main(string[] args)
{
char[] letters = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
int numberOfLetters = letters.Length; //26 LETTERS
Console.WriteLine("Number of letters: {0}", numberOfLetters);
for (int i = 0; i < numberOfLetters; i++)
{
Console.WriteLine(letters[i]);
}
Console.ReadKey();
}
Udvid din bruteforce algoritme så den kan distribueres på flere PC'er, så de hver kan tage et segment af kode,
Prøv at knække koden på følgende fil:
https://drive.google.com/file/d/1Fu9I-6HCKhU71gE1rMxpk-UZ2XrwVjeY/view?usp=sharing
Husk at fjerne blokaden lige som ved den sidste fil
Koden indeholder 6 ialt bogstaver (stadig kun lowercase bogstaver). Benyt hinandens computere til at finde koden.
Fredag:
Godmorgen. I dag vil jeg gerne have at i gennemgår følgende emner: UDP netværks-protokollen og tråde.
For at kunne sene data fra én PC til en anden igennem et netværk skal man benytte en netværks-protokol. Der findes mange protokoller som kan benyttes, men i skal i dag arbejde med UDP protokollen.
UDP er en simpel protokol som kan sende en datapakke afsted imod en IP adresse, men om pakken når frem eller ej, finder vi aldrig ud af. Der er altså i visse tilfælde 50% chance for at pakken når frem til modtageren, hvis vi er på et dårligt netværk.
For at se UDP i aktion, skal vi benytte en Listener og en Sender.
Prøv at indsætte følgende kode i 2 forskellige C# konsol programmer, og start Listeneren først, derefter start Senderen.
Listener:
static void Main(string[] args)
{
UdpClient client = new UdpClient(11001);
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 11001);
byte[] recievedBytes = client.Receive(ref endpoint);
string recievedMessage = Encoding.ASCII.GetString(recievedBytes);
Console.WriteLine("Beskeden var: " + recievedMessage);
Console.ReadKey();
}
Sender:
static void Main(string[] args)
{
Console.WriteLine("Type an IP address:");
string ip = Console.ReadLine();
UdpClient client = new UdpClient();
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ip), 11001);
string message = "Hej!";
byte[] bytesToSend = Encoding.ASCII.GetBytes(message);
client.Send(bytesToSend, bytesToSend.Length, endpoint);
Console.WriteLine("Message sendt!");
Console.ReadKey();
}
For at et program både kan sende OG modtage datapakker igennem UDP, skal vi benytte en tråd. En tråd er en måde hvor vi kan få vores applikation til at udføre 2 forskellige jobs på samme tid.
I C# er det heldigvis nemt at oprette en tråd.
Eksempel på en tråd:
static void Main(string[] args)
{
Console.WriteLine("Start");
Thread thread = new Thread(myThread);
thread.Start();
string input = Console.ReadLine();
Console.WriteLine(input);
Console.ReadKey();
}
static void myThread()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
}
Opgave:
Lav et program, som både kan sende og modtage data til og fra hinanden.
Se hvor langt du kan nå. Vi gennemgår løsningen på mandag.
TCP:
TCP sender:
static TcpClient tcpClient;
static NetworkStream ns;
static IPEndPoint endPoint;
static void Main(string[] args)
{
tcpClient = new TcpClient("172.16.237.161", 11000);
ns = tcpClient.GetStream();
for (int i = 1; i <= 100; i++)
{
byte[] bytesToSend = Encoding.ASCII.GetBytes(i.ToString() + "\n");
ns.Write(bytesToSend, 0, bytesToSend.Length);
}
Console.ReadKey();
}
TCP listener:
static TcpListener tcpListener;
static TcpClient tcpClient;
static IPEndPoint endPoint;
static NetworkStream ns;
static Stopwatch sw;
static long milliseconds;
static int index = 0;
static bool run = true;
static Thread t;
//Listens for TCP data
static void Main(string[] args)
{
t = new Thread(ListenerThread);
sw = new Stopwatch();
IPEndPoint ipEndPoint_any = new IPEndPoint(IPAddress.Any, 11000);
tcpListener = new TcpListener(ipEndPoint_any);
tcpClient = new TcpClient();
tcpListener.Start();
tcpClient = tcpListener.AcceptTcpClient();
endPoint = (IPEndPoint)tcpClient.Client.RemoteEndPoint;
ns = tcpClient.GetStream();
t.Start();
Console.ReadKey();
Console.WriteLine("I recived " + index + " number of packages out of 100.");
Console.WriteLine("It took " + milliseconds + " milliseconds in total");
run = false;
t.Abort();
Console.ReadKey();
}
static void ListenerThread()
{
while (run)
{
if (ns.DataAvailable)
{
if (!sw.IsRunning)
{
sw.Start();
}
byte[] recivedBytes = new byte[512];
byte[] trimmedBytes;
int bytesRead = ns.Read(recivedBytes, 0, recivedBytes.Length);
trimmedBytes = new byte[bytesRead];
Array.Copy(recivedBytes, trimmedBytes, bytesRead);
string result = Encoding.ASCII.GetString(trimmedBytes);
Console.Write(result);
milliseconds = sw.ElapsedMilliseconds;
index++;
}
}
}
Opgave:
Lav et simpelt chatprogram der benytter TCP, hvor man både kan sende og modtage beskeder.
TCP Listener v2.0
class Listener
{
TcpListener tcpListener;
TcpClient tcpClient;
IPEndPoint endPoint;
bool run = true;
List<Thread> threadList = new List<Thread>();
int port = 11000;
public Listener()
{
IPEndPoint ipEndPoint_any = new IPEndPoint(IPAddress.Any, port);
tcpListener = new TcpListener(ipEndPoint_any);
tcpClient = new TcpClient();
tcpListener.Start();
while (true)
{
if(tcpListener.Pending())
{
Thread.Sleep(100);
Thread t = new Thread(ListenerThread);
t.Start();
t.IsBackground = true;
threadList.Add(t);
}
}
}
void ListenerThread()
{
port++;
tcpClient = tcpListener.AcceptTcpClient();
endPoint = (IPEndPoint)tcpClient.Client.RemoteEndPoint;
NetworkStream ns = tcpClient.GetStream();
Console.WriteLine("TCP connection acceptet by thread.");
while (run)
{
if (ns.DataAvailable)
{
byte[] recivedBytes = new byte[512];
byte[] trimmedBytes;
int bytesRead = ns.Read(recivedBytes, 0, recivedBytes.Length);
trimmedBytes = new byte[bytesRead];
Array.Copy(recivedBytes, trimmedBytes, bytesRead);
string result = Encoding.ASCII.GetString(trimmedBytes);
Console.Write(result);
}
}
}
XML:
Konverter en klasse til XML:
static void Main(string[] args)
{
Henry h = new Henry();
Console.WriteLine("Money :" + h.money);
Console.WriteLine("Idears: " + h.idears);
Console.ReadKey();
//XML
XmlSerializer serializer = new XmlSerializer(typeof(Henry));
StringWriter sWriter = new StringWriter();
serializer.Serialize(sWriter, h);
string myXML = sWriter.ToString();
Console.WriteLine(myXML);
Console.ReadKey();
//Konverter XML tilbage til en klasse:
Henry h2 = new Henry();
StringReader sReader = new StringReader(myXML);
h2 = (Henry)serializer.Deserialize(sReader);
Console.WriteLine("Henry 2 money: " + h2.money);
Console.WriteLine("Henry 2 idears: " + h2.idears);
Console.ReadKey();
}
Henry klassen:
public class Henry
{
public float money = 1000;
public int idears = 0;
}
Opgave:
Konverter en klasse til XML og send den igennem en netværksforbindelse. Konverter da XML tilbage til en klasse på en anden computer.
Opgave med kryptering:
Lav et program med 2 funktioner {KrypterString, DekrypterString}
Programmet skal kunne kryptere en plan string til ulæselig tekst, og derefter kunne dekryptere det ulæselige tekst tilbage til plan tekst.
Implementer til sidst dette ind i jeres chatprogram.
Eksempel med interfaces:
https://drive.google.com/file/d/1nvg50p6XAFCT5H-eZSJlzPnSf3D6KDCV/view?usp=sharing
Valg af opgave
Du skal vælge et projekt som du skal arbejde med. Projektet skal opfylde følgende krav:
• Projektet skal være objekt-orienteret. (Projektet skal som minimum indeholde klasser og objekter.)
• Projektet skal indeholde kommunikation igennem et netværk. (Brug gerne sockets)
• Projektet skal have fokus på tråde.
Eksempel på eksamensopgave: https://drive.google.com/file/d/1UaeqLPVEFlnuAK8pw9GBS_uzGxgSzjat/view?usp=sharing