Avatar billede tras Juniormester
23. april 2007 - 11:26 Der er 64 kommentarer og
1 løsning

Kan jeg erstatte min lykke?

Hej jeg har arbejdet med en chat server og har et problem nemlig at den køre som en uendelig lykke. Er der ikke en måde jeg kan lave om på dette da det ikke er fedt at alle clients og servern bruger 100% cpu.

Her kan i se koden lavet af Micheal H som jeg har tænkt mig at lave fejlen på.

using System.IO;
using System.Net;
using System;
using System.Threading;
using N = System.Net; // Genvej - så man ikke skal skrive så meget.
using System.Collections;

class TalkServ
{
    // TcpListener lytter efter connections hele tiden og man kan snakke med den via TcpClient eller Socket
    System.Net.Sockets.TcpListener server;
    // Hashtable høre til system.collections og er en beholder for objector.
    public static Hashtable handles;
    public static Hashtable handleByConnect;

    public static void Main()
    {
        TalkServ TS = new TalkServ();
    }

    public TalkServ()
    {
        // Fortæller Hashtable hvor mange Objector den må indeholde?! ikke sikker
        handles = new Hashtable(100);
        handleByConnect = new Hashtable(100);
        // Server lytter på port 4296 kunne være mange andre men det er bare random.
        // Ved ikke at skrive IP men bare port lytter den på alle interfaces som maskinen har i sig.
        server = new System.Net.Sockets.TcpListener(4296);
        Console.WriteLine("Starter server");
        while (true)
        {
            server.Start();
            if (server.Pending())
            {
                // tager imod en client
                N.Sockets.TcpClient connection = server.AcceptTcpClient();
                Console.WriteLine("Connection Oprettet");
                // Tager i mod bruger og sender ham til BackForth som der fra hjælper ham igennem opsætningen.
                BackForth BF = new BackForth(connection);
            }
        }
    }

    public static void SendToAll(string name, string msg)
    {
        // Laver en slags multicast, alt som kommer fra en client bliver sendt til alle som er connectet til Min server
        StreamWriter SW;
        ArrayList ToRemove = new ArrayList(0);
        N.Sockets.TcpClient[] tc = new N.Sockets.TcpClient[TalkServ.handles.Count];
        TalkServ.handles.Values.CopyTo(tc, 0);
        for (int i = 0; i < tc.Length; i++)
        {
            try
            {
                if (msg.Trim() == "" || tc[i] == null)
                    continue;
                SW = new StreamWriter(tc[i].GetStream());
                // Standard for hvordan den skal vise den intastet verdi.
                SW.WriteLine(name + ": " + msg);
                // Reset så den er klar til ny intastning.
                SW.Flush();
                SW = null;
            }
            catch (Exception e44)
            {
                // Vis der sker en fejl i connection vil den skrive det i servern og smide clienten ud fra programmet.
                e44 = e44;
                string g = (string)TalkServ.handleByConnect[tc[i]];
                TalkServ.SendSysMsg("** " + g + " ** Connection Lukket.");
                TalkServ.handles.Remove(g);
                TalkServ.handleByConnect.Remove(tc[i]);
            }
        }
    }

    public static void SendSysMsg(string msg)
    {
        StreamWriter SW;
        ArrayList ToRemove = new ArrayList(0);
        N.Sockets.TcpClient[] tc = new N.Sockets.TcpClient[TalkServ.handles.Count];
        TalkServ.handles.Values.CopyTo(tc, 0);
        for (int i = 0; i < tc.Length; i++)
        {
            try
            {
                if (msg.Trim() == "" || tc[i] == null)
                    continue;
                SW = new StreamWriter(tc[i].GetStream());
                SW.WriteLine(msg);
                SW.Flush();
                SW = null;
            }
            catch (Exception e44)
            {
                e44 = e44;
                TalkServ.handles.Remove(TalkServ.handleByConnect[tc[i]]);
                TalkServ.handleByConnect.Remove(tc[i]);
            }
        }
    }
}//end of class TalkServ

class BackForth
{
    N.Sockets.TcpClient client;
    System.IO.StreamReader SR;
    System.IO.StreamWriter SW;
    string handle;

    public BackForth(System.Net.Sockets.TcpClient c)
    {
        client = c;
        Thread t = new Thread(new ThreadStart(init));
        t.Start();
    }

    private string GetHandle()
    {
        //Skriv navn
        SW.WriteLine("Skriv dit navn? ");
        SW.Flush();
        return SR.ReadLine();
    }

    private void run()
    {
        try
        {
            string l = "";
            while (true)
            {
                l = SR.ReadLine();
                TalkServ.SendToAll(handle, l);
            }
        }
        // skriver i consol hvad problemet er med connection til client.
        catch (Exception e44) { Console.WriteLine(e44); }
    }

    private void init()
    {
        SR = new System.IO.StreamReader(client.GetStream());
        SW = new System.IO.StreamWriter(client.GetStream());
        SW.WriteLine("Velkommen til MinChatServer");
        handle = GetHandle();
        while (TalkServ.handles.Contains(handle))
        {
            SW.WriteLine("Dette navn er desvære ibrug!");
            handle = GetHandle();
        }
        TalkServ.handles.Add(handle, client);
        TalkServ.handleByConnect.Add(client, handle);
        TalkServ.SendSysMsg("** " + handle + " ** Er kommet ind i chatten.");
        SW.WriteLine("Du kan nu skrive...\r\n-------------------------------");
        SW.Flush();
        Thread t = new Thread(new ThreadStart(run));
        t.Start();
    }
}
Avatar billede Slettet bruger
23. april 2007 - 11:52 #1
Er det i TalkServ() du mener at den kører uendeligt?

Du siger at den skal køre løkken altid, og acceptere forbindelser ved pending. Du burde nok køre den funktion i sin egen tråd og sige:

while (true)
{
    server.Start();
    if (server.Pending())
    {
        N.Sockets.TcpClient connection = server.AcceptTcpClient();
        Console.WriteLine("Connection Oprettet");
        BackForth BF = new BackForth(connection);
    }
    else
        Thread.Sleep(50);
}

Så vil den ikke bruge 100% cpu og det vil kører i sin egen tråd
Avatar billede tras Juniormester
23. april 2007 - 12:21 #2
Sweet var lige det jeg snakkede med min ven om. vi var lige igen med at slå op i TCP/IP sockets in c#

Mange tak for hjælpen. ;P
Avatar billede tras Juniormester
23. april 2007 - 12:26 #3
lige en ting til hvordan vil du lave en thread på denne her?! Den her lykke draber også computern :P

class TalkUser
{

    static Form talk;
    static N.Sockets.TcpClient TC; // forkortelse af System.Net.Sockets.TcpClient

    // Importere dll filsom skal bruges.
    [DllImport("kernel32.dll")]
    private static extern void ExitProcess(int a);

    public static void Main()
    {
        // Opsætning af Form
        talk = new Form();
        talk.Text = "MinChatClient - Af Nick, Kasper, Martin, Thomas";
        talk.Closing += new CancelEventHandler(talk_Closing);
        talk.Controls.Add(new TextBox());
        talk.Controls[0].Dock = DockStyle.Fill;
        talk.Controls.Add(new TextBox());
        talk.Controls[1].Dock = DockStyle.Bottom;
        ((TextBox)talk.Controls[0]).Multiline = true;
        ((TextBox)talk.Controls[1]).Multiline = true;
        talk.WindowState = FormWindowState.Maximized;
        talk.Show();
        ((TextBox)talk.Controls[1]).KeyUp += new KeyEventHandler(key_up);
        // IP som der skal connectes til.
        TC = new N.Sockets.TcpClient();
        TC.Connect("192.168.160.118", 4296);
        Thread t = new Thread(new ThreadStart(run));
        t.Start();
        while (true)
        {
            Application.DoEvents();
        }
    }
Avatar billede Slettet bruger
23. april 2007 - 12:41 #4
Hmm..

Hvorfor kalder du Application.DoEvents() i en lykke, hvad gør det?

Hvis du absolut skal kalde Application.DoEvents() hele tiden uden at det bruger for meget CPU så smid en Thread.Sleep(10); ind eller noget

Du kan køre funktionen i en tråd sådan her:

public MyFunc()
{

}

Thread MyThread = new Thread(new ThreadStart(MyFunc));
MyThread.Start();

Du skal måske nok smide koden du har der over i myfunc fx
Avatar billede tras Juniormester
23. april 2007 - 12:49 #5
Hvordan havde du tænkt dig?!

using System.IO;
using System.Net;
using System;
using System.Threading;
using N = System.Net; // igen forkortelse af system.net
using System.Collections;
using System.Windows.Forms;
using System.ComponentModel;
using System.Runtime.InteropServices;

class TalkUser
{

    static Form talk;
    static N.Sockets.TcpClient TC; // forkortelse af System.Net.Sockets.TcpClient

    // Importere dll filsom skal bruges.
    [DllImport("kernel32.dll")]
    private static extern void ExitProcess(int a);

    public static void Main()
    {
        // Opsætning af Form
        talk = new Form();
        talk.Text = "MinChatClient - Af Nick, Kasper, Martin, Thomas";
        talk.Closing += new CancelEventHandler(talk_Closing);
        talk.Controls.Add(new TextBox());
        talk.Controls[0].Dock = DockStyle.Fill;
        talk.Controls.Add(new TextBox());
        talk.Controls[1].Dock = DockStyle.Bottom;
        ((TextBox)talk.Controls[0]).Multiline = true;
        ((TextBox)talk.Controls[1]).Multiline = true;
        talk.WindowState = FormWindowState.Maximized;
        talk.Show();
        ((TextBox)talk.Controls[1]).KeyUp += new KeyEventHandler(key_up);
        // IP som der skal connectes til.
        TC = new N.Sockets.TcpClient();
        TC.Connect("192.168.160.118", 4296);
        Thread t = new Thread(new ThreadStart(run));
        t.Start();
        while (true)
        {
            Application.DoEvents();
        }
    }

    private static void talk_Closing(object s, CancelEventArgs e)
    {
        e.Cancel = false;
        Application.Exit();
        ExitProcess(0);
    }

    private static void key_up(object s, KeyEventArgs e)
    {
        TextBox TB = (TextBox)s;
        if (TB.Lines.Length > 1)
        {
            StreamWriter SW = new StreamWriter(TC.GetStream());
            SW.WriteLine(TB.Text);
            SW.Flush();
            TB.Text = "";
            TB.Lines = null;
        }
    }

    private static void run()
    {
        StreamReader SR = new StreamReader(TC.GetStream());
        while (true)
        {
            Application.DoEvents();
            TextBox TB = (TextBox)talk.Controls[0];
            TB.AppendText(SR.ReadLine() + "\r\n");
            TB.SelectionStart = TB.Text.Length;
        }
    }
}
Avatar billede Slettet bruger
23. april 2007 - 12:55 #6
Der er lige et par ting:

1: Hvorfor bruger du ExitProcess(0) fra dllimport. Du kan bruge Environment.Exit(0). Det giver samme resultat (Lukker alle tråde)

2: Hvorfor bruger du Windows forms fra et console projekt?
Avatar billede tras Juniormester
23. april 2007 - 12:58 #7
servern er console

og clientern er windows forms
Avatar billede tras Juniormester
23. april 2007 - 12:58 #8
det med environment.exit(0) var jeg ikke klarover
Avatar billede Slettet bruger
23. april 2007 - 13:04 #9
Hva hører koden til som du viser? Client ikk?

public static void Main()
    {
        // Opsætning af Form
        talk = new Form();

Du åbner en form fra et console projekt? det giver jo SLET ingen mening at gøre det
Avatar billede tras Juniormester
23. april 2007 - 13:10 #10
Jo det er clienten og hvad angår hvad den køre i virker den ikke i en consol application. :) har jeg ikke kunne få den til
Avatar billede Slettet bruger
23. april 2007 - 13:16 #11
Øhh.. ?

Clienten KØRER i en console app nu, og du opretter en Windows form, fra din console app

Hvorfor laver du ikke din client i en windows form?
Avatar billede tras Juniormester
23. april 2007 - 13:18 #12
NEJ clienten køre i en windows application

og servern køre i en CONSOL application
Avatar billede tras Juniormester
23. april 2007 - 13:28 #13
men tilbage til mit problem :) hvad gør jeg med lykken?
Avatar billede Slettet bruger
23. april 2007 - 13:42 #14
Jamen ffs

public static void Main() ER en console default contructer, det kan godt være du HAR en windows form i din client, men det bliver ÅBNEt via din console
Din klasse ser i øvrigt sådan her ud:

class TalkUser
{


Var din client et windows form projekt havde din klasse set nogenlunde sådan ud:

public partial class Form1 : Form
{

Ergo er din client som grundplan et console projekt hvor du bruger forms = giver ingen mening.

Grunden til jeg siger det er, at du ikke behøver den lykke hvis din klient kører som Windows form project
Avatar billede tras Juniormester
23. april 2007 - 14:09 #15
Ok. Nu er jeg ikke ekspert på dette område det jeg siger er at jeg køre den i en windows application for der virker kode. I consol application kan jeg ikke få den til at virke men somsagt er jeg helder ikke nogle expert inde for dette område jeg er stadig igang med at lære c# samt VS. :D

Jeg har med høj sansynlighed lavet noget forkert og det søger jeg hjælp til. Det giver ingen mening men det virker. Jeg vil gerne lave det på din måde men det er ikke bare noget jeg lige kan gøre.
Avatar billede Slettet bruger
23. april 2007 - 15:03 #16
Altså at køre serveren i console er nok det rigtige valg, da du ikke skal gøre så meget ved den, den skal bare køre og virke.

En client skal du somregel bruge et grafisk interface til, så der vil man typisk bruge windows forms. Du kan sagtens lave en fungerende client i forms.

Prøv engang. Lav et nyt windows form projekt og smid din kode derind.
Husk at alt der skal køre hele tiden i en lykke f.eks skal køre i sin egen tråd, ellers låser det formen. Dvs ting som en nytte tråd, der lytter på beskeder fra serveren.
Avatar billede tras Juniormester
24. april 2007 - 08:20 #17
Jeg prøver :D
Avatar billede tras Juniormester
24. april 2007 - 09:04 #18
Ok jeg har set hvad jeg kunne gøre jeg er somsagt ikke serlig god men er intraseret i at lave dette.

Jeg har nu lavet en rigtig windows form men der er nogle ting jeg bare ikke kan og er ikke helt sikker på det er rigtig vil i ikke være sød at tage et kig.

Jeg har 2fejl i form1.cs
The name 'TC' does not exist in the current context
The name 'TC' does not exist in the current context

Jeg har 1fejl i form1.designer.cs
No overload for 'form1_load' matches delegate 'System.EventHandler'


Form1.cs ------------------------
using System;
using System.IO;
using System.Threading;
using N = System.Net; // igen forkortelse af system.net
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MinChatClient2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            N.Sockets.TcpClient TC; // forkortelse af System.Net.Sockets.TcpClient
            TC = new N.Sockets.TcpClient();
            TC.Connect("192.168.160.118", 4296);
            Thread t = new Thread(new ThreadStart(run));
            t.Start();
        }

        public void Event()
        {
            while (true)
            {
                Application.DoEvents();
            }
        }

        private void Form1_key_up(object sender, KeyEventArgs e)
        {
            if (TB_R.Lines.Length > 1)
            {
                StreamWriter SW = new StreamWriter(TC.GetStream());
                SW.WriteLine(TB_R.Text);
                SW.Flush();
                TB_R.Text = "";
                TB_R.Lines = null;
            }
        }

        private void run()
        {
            StreamReader SR = new StreamReader(TC.GetStream());
            while (true)
            {
                Application.DoEvents();
                TB_W.AppendText(SR.ReadLine() + "\r\n");
                TB_W.SelectionStart = TB_W.Text.Length;
            }
        }

        private void Form1_Load(object sender, CancelEventArgs e)
        {
            e.Cancel = false;
            Application.Exit();
            Environment.Exit(0);
        }

        private void TB_R_TextChanged(object sender, EventArgs e)
        {

        }

        private void TB_W_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

Form1.Designer.cs -------------------------------
namespace MinChatClient2
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.TB_R = new System.Windows.Forms.TextBox();
            this.TB_W = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            //
            // TB_R
            //
            this.TB_R.Location = new System.Drawing.Point(12, 12);
            this.TB_R.Multiline = true;
            this.TB_R.Name = "TB_R";
            this.TB_R.Size = new System.Drawing.Size(268, 216);
            this.TB_R.TabIndex = 0;
            this.TB_R.TextChanged += new System.EventHandler(this.TB_R_TextChanged);
            //
            // TB_W
            //
            this.TB_W.Location = new System.Drawing.Point(12, 234);
            this.TB_W.Multiline = true;
            this.TB_W.Name = "TB_W";
            this.TB_W.Size = new System.Drawing.Size(268, 20);
            this.TB_W.TabIndex = 1;
            this.TB_W.TextChanged += new System.EventHandler(this.TB_W_TextChanged);
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.TB_W);
            this.Controls.Add(this.TB_R);
            this.Name = "Form1";
            this.Text = "MinChatClient - Af Nick, Kasper, Martin, Thomas";
            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.TextBox TB_R;
        private System.Windows.Forms.TextBox TB_W;
    }
}
Avatar billede Slettet bruger
24. april 2007 - 09:15 #19
Application.DoEvents() skal væk fra din form1.cs, så fjern Event() funktionen.

Lav det noget i denne stil (lavet i hånden så der er nok fejl)

using System;
using System.IO;
using System.Threading;
using N = System.Net; // igen forkortelse af system.net
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MinChatClient2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            N.Sockets.TcpClient TC; // forkortelse af System.Net.Sockets.TcpClient
            TC = new N.Sockets.TcpClient();
            TC.Connect("192.168.160.118", 4296);
            Thread t = new Thread(new ThreadStart(run));
            t.Start();
        }

        public void Event()
        {
            while (true)
            {
                Application.DoEvents();
            }
        }

        private void Form1_key_up(object sender, KeyEventArgs e)
        {
            if (TB_R.Lines.Length > 1)
            {
                StreamWriter SW = new StreamWriter(TC.GetStream());
                SW.WriteLine(TB_R.Text);
                SW.Flush();
                TB_R.Text = "";
                TB_R.Lines = null;
            }
        }

        private void run()
        {
            StreamReader SR = new StreamReader(TC.GetStream());
            while (true)
            {
                Application.DoEvents();
                TB_W.AppendText(SR.ReadLine() + "\r\n");
                TB_W.SelectionStart = TB_W.Text.Length;
            }
        }

        private void Form1_Load(object sender, CancelEventArgs e)
        {
            e.Cancel = false;
            Application.Exit();
            Environment.Exit(0);
        }

        private void TB_R_TextChanged(object sender, EventArgs e)
        {

        }

        private void TB_W_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
Avatar billede Slettet bruger
24. april 2007 - 09:15 #20
hov, forkert knap på musen :P ignorer sidste post
Avatar billede tras Juniormester
24. april 2007 - 09:22 #21
har rattet fejlene men den får min server til at gå ned

using System;
using System.IO;
using System.Threading;
using N = System.Net; // igen forkortelse af system.net
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MinChatClient2
{
    public partial class Form1 : Form
    {
        N.Sockets.TcpClient TC; // forkortelse af System.Net.Sockets.TcpClient
        public Form1()
        {
            InitializeComponent();
           
            TC = new N.Sockets.TcpClient();
            TC.Connect("192.168.160.118", 4296);
            Thread t = new Thread(new ThreadStart(run));
            t.Start();
        }

        public void Event()
        {
            while (true)
            {
                Application.DoEvents();
            }
        }

        private void Form1_key_up(object sender, KeyEventArgs e)
        {
            if (TB_R.Lines.Length > 1)
            {
                StreamWriter SW = new StreamWriter(TC.GetStream());
                SW.WriteLine(TB_R.Text);
                SW.Flush();
                TB_R.Text = "";
                TB_R.Lines = null;
            }
        }

        private void run()
        {
            StreamReader SR = new StreamReader(TC.GetStream());
            while (true)
            {
                Application.DoEvents();
                TB_W.AppendText(SR.ReadLine() + "\r\n");
                TB_W.SelectionStart = TB_W.Text.Length;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Application.Exit();
            Environment.Exit(0);
        }

        private void TB_R_TextChanged(object sender, EventArgs e)
        {

        }

        private void TB_W_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
Avatar billede tras Juniormester
24. april 2007 - 09:24 #22
Her er det du har skrevet men rattet så ingen fejl meddegelser men. den åbner ikke og servern crasher!


using System;
using System.IO;
using System.Threading;
using N = System.Net; // igen forkortelse af system.net
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MinChatClient2
{
    public partial class Form1 : Form
    {
        N.Sockets.TcpClient TC; // forkortelse af System.Net.Sockets.TcpClient
        public Form1()
        {
            InitializeComponent();
            TC = new N.Sockets.TcpClient();
            TC.Connect("192.168.160.118", 4296);
            Thread t = new Thread(new ThreadStart(run));
            t.Start();
        }

        public void Event()
        {
            while (true)
            {
                Application.DoEvents();
            }
        }

        private void Form1_key_up(object sender, KeyEventArgs e)
        {
            if (TB_R.Lines.Length > 1)
            {
                StreamWriter SW = new StreamWriter(TC.GetStream());
                SW.WriteLine(TB_R.Text);
                SW.Flush();
                TB_R.Text = "";
                TB_R.Lines = null;
            }
        }

        private void run()
        {
            StreamReader SR = new StreamReader(TC.GetStream());
            while (true)
            {
                Application.DoEvents();
                TB_W.AppendText(SR.ReadLine() + "\r\n");
                TB_W.SelectionStart = TB_W.Text.Length;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Application.Exit();
            Environment.Exit(0);
        }

        private void TB_R_TextChanged(object sender, EventArgs e)
        {

        }

        private void TB_W_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
Avatar billede Slettet bruger
24. april 2007 - 09:26 #23
10 mins, jeg laver lige noget for dig..
Avatar billede tras Juniormester
24. april 2007 - 09:27 #24
oki
Avatar billede tras Juniormester
24. april 2007 - 10:06 #25
Ved ikke om det hjælper med jeg har probs med

return SR.ReadLine();
error
IOException was unhandled
Avatar billede tras Juniormester
24. april 2007 - 10:11 #26
sorry forkert
Avatar billede tras Juniormester
24. april 2007 - 10:12 #27
TC.Connect("192.168.160.118", 4296);
Socket was unhandled
Avatar billede tras Juniormester
24. april 2007 - 10:23 #28
No connection could be made because the target machine actively refused it?
Avatar billede Slettet bruger
24. april 2007 - 10:24 #29
er færdig om lidt..
Avatar billede Slettet bruger
24. april 2007 - 10:32 #30
Avatar billede Slettet bruger
24. april 2007 - 10:34 #31
Kør server først, og derefter clienten

Du kan sende til serveren, og serveren pinger clienten hvert sekund for at se om du er "i live". Du kan tilslutte så mange clienter som du har lyst til på samme tid
Avatar billede tras Juniormester
24. april 2007 - 10:44 #32
:) kan se den connector men man kan bare ikke skrive og den bliver ved med at skrive ping i vinduet :P
Avatar billede tras Juniormester
24. april 2007 - 10:45 #33
så er ping fjernet men det text du sender til servern kommer ikke tilbage til en selv
Avatar billede tras Juniormester
24. april 2007 - 11:05 #34
Jeg kan få dem som sender til at få deres egen besked tilbage så den står på deres skærm men de andre clients modtager ikke beskeden

while (true)
            {
                try
                {
                    for (int i = 0; i < ClientList.Count; i++)
                    {
                        CurrentClient = ClientList[i];

                        if (CurrentClient.Available > 0)
                        {
                            StreamReader reader = new StreamReader(CurrentClient.GetStream());
                            string Data = reader.ReadLine();
                            Console.WriteLine("Recv msg: " + Data);

                            StreamWriter writer = new StreamWriter(CurrentClient.GetStream());
                            writer.WriteLine("Recv msg: " + Data);
                            writer.Flush();
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }

                Thread.Sleep(20);
            }
Avatar billede Slettet bruger
24. april 2007 - 11:08 #35
ja så skal du jo lave en funktion der sender til alle andre end den der sender beskeden
Avatar billede tras Juniormester
24. april 2007 - 11:08 #36
vil den ikke sige der kun er 1 client
for (int i = 0; i < ClientList.Count; i++)
da den null stiller den når en client connector?!
Avatar billede Slettet bruger
24. april 2007 - 11:13 #37
I ListenForConnections funktionen tilføjer den en client til det array hver gang en client connecter, og fjerner en når de disconnecter fra IsAlive. Så det array indeholder altid alle aktive clients
Avatar billede Slettet bruger
24. april 2007 - 11:16 #38
Den SKAL sende den ping commando, ellers opdager den ikke at klienten er disconnected. Du kan gøre det på klient siden at du siger

if(msg = "Ping :)")
  //Do nothing
else
{
  //Hva siger server mon?
}
Avatar billede tras Juniormester
24. april 2007 - 12:09 #39
if(msg = "Ping :)")
  //Do nothing
else
{
  //Hva siger server mon?
}

Kan jeg ikke se hvor skal ind hende. Men det andet vil jeg gerne prøve at arbejde lidt med i nu.
Avatar billede Slettet bruger
24. april 2007 - 12:33 #40
det skal ind hvor clienten modtager en besked fra serveren, det var bare et eksempel, du skal nok bruge en:

Switch(msg)
{
    Case "Ping :)":
        Break;


}
Avatar billede tras Juniormester
24. april 2007 - 12:40 #41
Error    1    Cannot implicitly convert type 'string' to 'bool'

Denne besked får jeg når jeg sætter den ind ?!
Avatar billede tras Juniormester
24. april 2007 - 12:42 #42
private void WriteMsg(string msg)
        {
            if (msg = "Ping :)")
            {
                //Do nothing
            }
            else
            {
                TB_W.AppendText(msg + Environment.NewLine);
                TB_W.SelectionStart = TB_W.Text.Length;
            }
           
        }
Avatar billede tras Juniormester
24. april 2007 - 12:45 #43
nej undskyld der er der du sender til server
Avatar billede Slettet bruger
24. april 2007 - 12:47 #44
husk ==, et = var en fejl
Avatar billede tras Juniormester
24. april 2007 - 12:49 #45
sådan.

Kan du give et hint til server delen hvor den skal sende beskeden til alle andre og en selv. så man kan se hvad man selv har skrevet..

Server jeg snakker om nu
Avatar billede Slettet bruger
24. april 2007 - 12:53 #46
Du kan bare tilføje det du skriver til de andre til listen når du sender

lav en lykke, der siger for hver client i ClientList, send en kommando med argument, hvor argument er det han har skrevet, og hvis clienten i listen er = den der har sendt beskeden, så ignorer.
Avatar billede tras Juniormester
24. april 2007 - 12:56 #47
Error1    The type or namespace name 'FormClosingEventArgs' could not be found (are you missing a using directive or an assembly reference?)


er dette noget du kender løsningen på :) ser lige på det med lykken
Avatar billede tras Juniormester
24. april 2007 - 12:59 #48
nej nej for som programmet er nu modtager ham som skriver til server intet selv så den besked han sender til server skal også tilbage til ham selv

eks

client1 msg. Hej
-> send til server
server client1 msg. hej

men på client1's skærm står der "" ingen ting. Så beskeden skal bare sendes til alle ?! jeg er ikke gal på den vel?
Avatar billede tras Juniormester
24. april 2007 - 13:00 #49
alså

if (CurrentClient.Available > 0)
                        {
                            StreamReader reader = new StreamReader(CurrentClient.GetStream());
                            string Data = reader.ReadLine();
                            Console.WriteLine("Recv msg: " + Data);

                            StreamWriter writer = new StreamWriter(CurrentClient.GetStream());
                            writer.WriteLine("Recv msg: " + Data);
                            writer.Flush();
                        }

Så kan han selv se hvad han har skrevet?!
Avatar billede Slettet bruger
24. april 2007 - 13:04 #50
Det er dumt at sende det tilbage til ham han selv har skrevet. Det skal sendes til alle andre end ham selv
Avatar billede tras Juniormester
24. april 2007 - 13:06 #51
for (allesammen i ClientList) <-- hvordan?!
{
StreamReader reader = new StreamReader(CurrentClient.GetStream());
string Data = reader.ReadLine();
StreamWriter writer = new StreamWriter(CurrentClient.GetStream());
writer.WriteLine("Besked: " + Data);
writer.Flush();
}

Noget alla dette i en private static void sendtoall()???
Avatar billede tras Juniormester
24. april 2007 - 13:19 #52
Når du skriver i messenger vil du så ikke også se den besked du har skrevet..

eks

Dig: hej
Mig: hej hej
Dig: hvad så
Mig: ikke så meget

men som du siger nu vil du virke sådan

Mig: hej hej
Mig: ikke så meget

Kan du se hvad jeg mener?
Avatar billede tras Juniormester
24. april 2007 - 13:21 #53
set fra din side af.

jeg vil så se

Dig: hej
Dig: hvad så

set fra min side af
Avatar billede tras Juniormester
24. april 2007 - 13:23 #54
men ja det er dumt nu da du siger det at den skal ned og runde servern. men så er det vil bare TB_W == det man selv skriver
Avatar billede tras Juniormester
24. april 2007 - 13:31 #55
if (InputBox.Text != string.Empty)
{
  ServerWriter.WriteLine(InputBox.Text);
  TB_W.Text = InputBox.Text;
  ServerWriter.Flush();
}
Avatar billede tras Juniormester
24. april 2007 - 13:32 #56
der også bruger den ikke servern mere.?! men det er mig stadig et stort ? hvordan du vil lave den der send funktion!

den kan jeg ikke lige regne ud
Avatar billede Slettet bruger
24. april 2007 - 13:40 #57
SendToUsers(CurrentClient, Data); i din modtager funktion på serveren

private void SendToUsers(TcpClient FromUser, string msg)
        {
            foreach (TcpClient client in ClientList)
            {
                if (client != FromUser)
                {
                    StreamWriter writer = new StreamWriter(client.GetStream());
                    writer.WriteLine(msg);
                    writer.Flush();
                }
            }
        }

Du skal nok lave noget fælles for at sende til brugerne, så du ikke opretter en streamreader/writer hver gang..
Avatar billede tras Juniormester
24. april 2007 - 13:46 #58
sådan her?

if (CurrentClient.Available > 0)
                        {
                            // Læser data fra clients
                            StreamReader reader = new StreamReader(CurrentClient.GetStream());
                            // Container for data
                            string Data = reader.ReadLine();
                            SendToUsers(CurrentClient, Data);
                        }


Error    1    An object reference is required for the nonstatic field, method, or property 'ChatServer.Program.SendToUsers(System.Net.Sockets.TcpClient, string)'    C:\Documents and Settings\Nick Larsen\Desktop\TCP Chat\ChatServer\ChatServer\Program.cs    96    29    ChatServer
Avatar billede tras Juniormester
24. april 2007 - 13:48 #59
og et lille fif fra mig :) burde være på tide jeg kommer med lidt.

//Start listening thread
                ListenThread = new Thread(new ThreadStart(ListenForData));
                ListenThread.IsBackground = true;
                ListenThread.Start();

ListenThread.IsBackground = true; så den lukker alle tråde når hovedtråden lukker. bare for at være extra sikker
Avatar billede Slettet bruger
24. april 2007 - 13:51 #60
du skal lige skrive

private static void SendToUsers(TcpClient FromUser, string msg)

i steddet for

private void SendToUsers(TcpClient FromUser, string msg)
Avatar billede tras Juniormester
24. april 2007 - 13:55 #61
hvor helt presis skulle SendToUsers(CurrentClient, Data);  være i koden
Avatar billede Slettet bruger
24. april 2007 - 14:00 #62
ej nu stopper du! fordi den skal sende til alle andre end den der sender beskeden!
Avatar billede Slettet bruger
24. april 2007 - 14:00 #63
kunne være du skulle starte med noget nemmere
Avatar billede tras Juniormester
24. april 2007 - 14:28 #64
yes jeg tager noget lættere så. Vis du laver en svar besked så får du nogle velfortjænte points
Avatar billede Slettet bruger
24. april 2007 - 14:38 #65
svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester