Permalänk
Medlem

Programmering 2

Programmering 2
Hej, jag håller på med en uppgift som heter Guldkortet i C#. Programmet ska läsa in två stycken textfiler från en server och sedan separera dom. Efter det så ska programmet jämföra min klient med en server och se vad som stämmer överens. Beroende på vad som stämmer överens ska programmet visa ett meddelande. Problemet jag har är att det enda meddelandet som kommer upp är det meddelandet i ELSE inuti: private void Meddelande(string receivedUserNr, string receivedCardNr, TcpClient klient). Hur jag ska åtgärda det vet jag inte, känns som jag missar något väldigt tydligt. Så jag undrar om det finns någon vänlig själ som skulle kunna hjälpa mig. Tack på förhand.

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Net; using System.Net.Sockets; namespace GuldKortet2222 { public partial class Form1 : Form { private TcpListener lyssnare; private int port = 12345; private string meddelandeSträng; private List<Kund> kundLista = new List<Kund>(); private List<Kort> kortLista = new List<Kort>(); private List<string> läslista = new List<string>(); public Form1() { InitializeComponent(); } private void StartaServer_Click(object sender, EventArgs e) { StartServer(); StartaMottagning(); StartaServer.Enabled = false; } private void LoadUser_Click(object sender, EventArgs e) { kundLista.Clear(); DelaKund(); } private void LoadCard_Click(object sender, EventArgs e) { kortLista.Clear(); DelaKort(); } private void StartServer() { try { lyssnare = new TcpListener(IPAddress.Any, port); lyssnare.Start(); StartaServer.Text = "Online"; StartaServer.BackColor = Color.Green; } catch (Exception error) { MessageBox.Show(error.Message, Text); return; } } private async void StartaMottagning() { try { TcpClient klient = await lyssnare.AcceptTcpClientAsync(); MessageBox.Show("Connected"); StartaLäsning(klient); } catch (Exception error) { MessageBox.Show(error.Message); } } private async void StartaLäsning(TcpClient klient) { try { byte[] buffert = new byte[1024]; int n = await klient.GetStream().ReadAsync(buffert, 0, buffert.Length); meddelandeSträng = Encoding.Default.GetString(buffert, 0, n); string[] temp = meddelandeSträng.Split('-'); string receivedUserNr = temp[0]; string receivedCardNr = temp[1]; Meddelande(receivedUserNr, receivedCardNr, klient); StartaLäsning(klient); } catch (Exception error) { MessageBox.Show(error.Message); } return; } private async void StartaSändning(string message, TcpClient klient) { byte[] bytes = Encoding.Unicode.GetBytes(message); try { await klient.GetStream().WriteAsync(bytes, 0, bytes.Length); } catch (Exception error) { MessageBox.Show(error.Message); } } private void DelaKort() { List<string> itemSaver = new List<string>(); if (File.Exists("kortlista.txt")) { StreamReader reader = new StreamReader("kortlista.txt", Encoding.UTF8, false); string item = ""; while ((item = reader.ReadLine()) != null) { itemSaver.Add(item); } foreach (string a in itemSaver) { string[] vektor = a.Split(new string[] { "###" }, StringSplitOptions.None); string kortNummer = vektor[0]; string typ = vektor[1]; Kort kort; switch (vektor[1]) { case "Dunderkatt": kort = new Dunderkatt(kortNummer, typ); kortLista.Add(kort); break; case "Överpanda": kort = new Överpanda(kortNummer, typ); kortLista.Add(kort); break; case "Kristallhäst": kortLista.Add(kort); break; case "Eldtomat": kort = new Eldtomat(kortNummer, typ); kortLista.Add(kort); break; default: MessageBox.Show("faf"); break; } } reader.Close(); } } public void DelaKund() { List<string> itemSaver = new List<string>(); if (File.Exists("kundlista.txt")) { StreamReader kundReader = new StreamReader("kundlista.txt", Encoding.UTF8, false); string item = ""; while ((item = kundReader.ReadLine()) != null) { itemSaver.Add(item); } foreach (string a in itemSaver) { string[] vektor = a.Split(new string[] { "###" }, StringSplitOptions.None); string kundNummer = vektor[0]; string Namn = vektor[1]; string stad = vektor[2]; } kundReader.Close(); } } private void Meddelande(string receivedUserNr, string receivedCardNr, TcpClient klient) { DelaKort(); DelaKund(); Kund Användare = Kund.Info(receivedUserNr, kundLista); Kort vinstKort = Kort.Info(receivedCardNr, kortLista); if (Kund.KollaNr(receivedUserNr, kundLista)) { if (Kort.KollaNmr(receivedCardNr, kortLista)) { StartaSändning("Grattis!" + Användare + "Du har vunnit ett" + vinstKort + "Du kan hämta det i din närmsta butik i ", klient); } else { StartaSändning("Ingen vinst tyvärr" + Användare, klient); } } else { if (Kort.KollaNmr(receivedCardNr, kortLista)) { StartaSändning("Användarnamnet existerar tyvärr inte, men du vann ett " + vinstKort, klient); } else { StartaSändning("Användarnummret finns tyvärr inte du fick inte någon vinst heller tyvärr.", klient); } } } } public class Kund { public string nummer; public string namn; public string stad; public Kund(string inNummer, string inNamn, string inStad) { nummer = inNummer; namn = inNamn; stad = inStad; } public static bool KollaNr(string d, List<Kund> kunder) { foreach (Kund kund in kunder) { if (d == kund.nummer) { return true; } } return false; } public static Kund Info(string s, List<Kund> kunder) { foreach (Kund kund in kunder) { if (s == kund.nummer) { return kund; } } return null; } public override string ToString() { return "Namn: " + namn + "stad: " + stad + nummer; } } public class Kort { protected string nummer; public string typ; public Kort(string inNummer, string inTyp) { nummer = inNummer; typ = inTyp; } public static bool KollaNmr(string s, List<Kort> korten) { foreach (Kort kort in korten) { if (s == kort.nummer) { return true; } } return false; } public static Kort Info(string s, List<Kort> korten) { foreach (Kort kort in korten) { if (s == kort.nummer) { return kort; } } } return null; } } public class Dunderkatt : Kort { public Dunderkatt(string inNummer, string inTyp) : base(inNummer, inTyp) { } } public class Kristallhäst : Kort { public Kristallhäst(string inNummer, string inTyp) : base(inNummer, inTyp) { } } public class Överpanda : Kort { public Överpanda(string inNummer, string inTyp) : base(inNummer, inTyp) { } } public class Eldtomat : Kort { public Eldtomat(string inNummer, string inTyp) : base(inNummer, inTyp) { } } }

Permalänk
Medlem

Du borde indentera den där koden. Det blir väldigt jobbigt att läsa annars.

Permalänk
Medlem
Skrivet av Tanari:

Du borde indentera den där koden. Det blir väldigt jobbigt att läsa annars.

Hur gör jag det? Förstod inte hur man gjorde

Permalänk
Medlem
Skrivet av biua:

Hur gör jag det? Förstod inte hur man gjorde

Hej,
Hur mycket programmering har du hållit på med? Det känns som att du börjar i fel ände, om du börjar programmera innan du ens kan de mest banala saker, så som indentering. Vad kör du för editor? Väldigt svårt att läsa din kod nu.

Jag menar, du kommer ju säkerligen lära dig mer av att försöka, än att få ett direkt svar från SweClockers.

Permalänk
Skrivet av biua:

Hur gör jag det? Förstod inte hur man gjorde

Formattera koden med något av följande:

  • [code]<insert code>[/code]

  • [pre]<insert code>[/pre]

  • [cmd]<insert code>[/cmd]

Ex. du skriver [code] i början av kodstycket och avslutar kodstycket med [/code]

Mer info om detta: https://www.sweclockers.com/forum/trad/1539788-faq-sweclocker...

Permalänk
Medlem
Skrivet av biua:

Hur gör jag det? Förstod inte hur man gjorde

Du behöver använda [code] taggar runt din kod: https://www.bbcode.org/showing-code-with-bbcode.php

Permalänk

Jag tror felet är att du inte lägger till något i "kundLista".

public void DelaKund() { List < string > itemSaver = new List < string > (); if (File.Exists("kundlista.txt")) { StreamReader kundReader = new StreamReader("kundlista.txt", Encoding.UTF8, false); string item = ""; while ((item = kundReader.ReadLine()) != null) { itemSaver.Add(item); } foreach(string a in itemSaver) { string[] vektor = a.Split(new string[] { "###" }, StringSplitOptions.None); string kundNummer = vektor[0]; string Namn = vektor[1]; string stad = vektor[2]; kundLista.add(new Kund(kundNummer, Namn, stad)); // <-- SAKNAS } kundReader.Close(); } }

Permalänk
Medlem

Så nu är den kanske lite enklare att läsa.

Permalänk
Medlem
Skrivet av Pepe Silvia:

Jag tror felet är att du inte lägger till något i "kundLista".

public void DelaKund() { List < string > itemSaver = new List < string > (); if (File.Exists("kundlista.txt")) { StreamReader kundReader = new StreamReader("kundlista.txt", Encoding.UTF8, false); string item = ""; while ((item = kundReader.ReadLine()) != null) { itemSaver.Add(item); } foreach(string a in itemSaver) { string[] vektor = a.Split(new string[] { "###" }, StringSplitOptions.None); string kundNummer = vektor[0]; string Namn = vektor[1]; string stad = vektor[2]; kundLista.add(new Kund(kundNummer, Namn, stad)); // <-- SAKNAS } kundReader.Close(); } }

Lade till det men blev fortfarande samma problem..

Permalänk
Medlem

private async void StartaLäsning(TcpClient klient) { try { byte[] buffert = new byte[1024]; int n = await klient.GetStream().ReadAsync(buffert, 0, buffert.Length); meddelandeSträng = Encoding.Default.GetString(buffert, 0, n); string[] temp = meddelandeSträng.Split('-'); string receivedUserNr = temp[0]; string receivedCardNr = temp[1]; Meddelande(receivedUserNr, receivedCardNr, klient); StartaLäsning(klient); } catch (Exception error) { MessageBox.Show(error.Message); } return; }

Oklart för mig vad ditt problem är, men den här koden har de vanliga nybörjarmisstagen.

Rent hypotetiskt kan du få noll eller ett fåtal bytes i läsningen. Klienten kanske bara har kopplat upp sig och fått över några få bytes. TCP skickar en ström, inte paket, så du vet inte när ett meddelande är slut förrän du har tittat tillräckligt långt i strömmen och kollat efter någon form av slutmarkering (eller ett fixt antal bytes). I praktiken, med korta meddelanden så kommer det inte hända, speciellt inte när man kör lokalt.

Hypotetiskt kan det meddelande som klienten skickar vara längre än 1024 bytes. Då kommer du lämna skräpet som kommer efter de första 1024 bytesen hos OS:et och det kommer dyka upp vid nästa läsning, såvida du inte kopplar ner klienten (och det gör du i alla fall inte här). Poängen är: Lita aldrig på att klienten följer protokollet. Vad händer om du aldrig får ett bindestreck?

Att du anropar StartaLäsning från sig själv tyder på att du trots allt förväntar dig att den andra sidan skickar flera meddelanden på rad utan att vänta på svar från servern, och då är frågan hur du gör för att hantera meddelande nummer två som kommer in i buffern. Som det ser ut nu kommer det ut som del av receivedCardNr, vilket kan vara ditt problem.

Nåja. Du behöver hitta ett sätt att tyda vilka meddelanden du faktiskt läser från klienten. Om du inte använder debuggern (vilket är det enklaste), dumpa meddelandeSträng, receivedUserNr, receivedCardNr någonstans där du kan se deras innehåll, till exempel till till System.Diagnostics.Debug.WriteLine() så att texterna skrivs till output window i Visual Studio. Sedan borde det vara elementärt att förstå vad som händer i Meddelande().

Permalänk
Medlem

private void Meddelande(string receivedUserNr, string receivedCardNr, TcpClient klient) { DelaKort(); DelaKund(); Kund Användare = Kund.Info(receivedUserNr, kundLista); Kort vinstKort = Kort.Info(receivedCardNr, kortLista); if (Kund.KollaNr(receivedUserNr, kundLista)) { // 1 if (Kort.KollaNmr(receivedCardNr, kortLista)) { // 3 StartaSändning("Grattis!" + Användare + "Du har vunnit ett" + vinstKort + "Du kan hämta det i din närmsta butik i ", klient); } else { // 4 StartaSändning("Ingen vinst tyvärr" + Användare, klient); } } else { // 2 if (Kort.KollaNmr(receivedCardNr, kortLista)) { // 5 StartaSändning("Användarnamnet existerar tyvärr inte, men du vann ett " + vinstKort, klient); } else { // 6 StartaSändning("Användarnummret finns tyvärr inte du fick inte någon vinst heller tyvärr.", klient); } } } }

Här har du 3st if satser alla kör

Kort.KollaNmr(receivedCardNr, kortLista)

Vilket betyder att om den första if satsen får "true" tillbaka så att du nå "1" så betyder det att om du kör samma igen så kommer alltid "3" köras. Och samma i else "2" kommer alltid "6" köras.