Avatar billede maqhem Nybegynder
26. juni 2007 - 11:46 Der er 6 kommentarer og
2 løsninger

TCP/IP Socket

Jeg har kigget på eksperten for kodestumper til at få en TCP/IP Socket op at stå, og jeg fandt http://www.eksperten.dk/spm/557539.
Den viser det jo perfekt, og har været en super inspiration. Jeg er ikke selv vildt dygtig til C# eller socket connections endnu, men det er lykkedes mig med lidt hjælp fra forige link at lave en meget, meget simpel one-way-solution, så jeg kan sende data fra client til server, der så outputter det. Jeg har følgende koder:

Client:
------------------------
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;

namespace Socket
{
    class Client : Form
    {
        private Label label;
        private TextBox textbox;
        private Button button;

        private TcpClient client;
        private StreamReader read;
        private StreamWriter write;

        [STAThread]
        public static void Main(string[] args)
        {
            Application.Run(new Client());
        }

        public Client()
        {
            this.Width = 200;
            this.Height = 96;

            label = new Label();
            label.Text = "Enter some data:";
            label.AutoSize = true;

            textbox = new TextBox();
            textbox.Top = 17;
            textbox.Left = 4;
            textbox.Width = 184;

            button = new Button();
            button.Text = "Send data";
            button.Top = 38;
            button.Left = 4;
            button.Width = 184;
            button.Height = 20;
            button.Click += new EventHandler(Out);

            Controls.Add(label);
            Controls.Add(textbox);
            Controls.Add(button);

            client = new TcpClient("localhost", 2000);
            read = new StreamReader(client.GetStream());
            write = new StreamWriter(client.GetStream());
        }

        private void Out(object sender, System.EventArgs e)
        {
            write.WriteLine(textbox.Text);
            write.Flush();
            textbox.Text = "";
        }
    }
}
------------------------

Server:
------------------------
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;

namespace Socket
{
    class Server : Form
    {
        private Label label;
        private RichTextBox textbox;

        private TcpListener server;
        private TcpClient client;
        private StreamReader read;
        private StreamWriter write;

        [STAThread]
        public static void Main(string[] args)
        {
            Application.Run(new Server());
        }

        public Server()
        {
            this.Text = "Server";
            this.Width = 260;
            this.Height = 271;

            label = new Label();
            label.Text = "Primitive Server\nPort: 2000\nVersion: 1.0\nCreated by Maqhem (http://www.maqhem.com/)\n\nThis console serve as a server.\nPlease do not disrupt the progress in this console!";
            label.AutoSize = true;

            textbox = new RichTextBox();
            textbox.Left = 4;
            textbox.Top = 93;
            textbox.Width = 244;
            textbox.Height = 140;

            server = new TcpListener(IPAddress.Any, 2000);
            server.Start();
            client = server.AcceptTcpClient();
            read = new StreamReader(client.GetStream());
            write = new StreamWriter(client.GetStream());
            (new Thread(new ThreadStart(Income))).Start();

            Controls.Add(label);
            Controls.Add(textbox);
        }

        private void Income()
        {
            string line;
            while ((line = read.ReadLine()) != null)
            {
                this.textbox.Text += line + "\r\n";
            }
        }
    }
}
------------------------

Det virker fint, men nu har jeg lige to spørgsmål:
1. Hvordan skal min event se ud, så jeg lukke min connection ordentligt, når én af filerne lukkes, eller connection afbrydes, så der ikke kommer en fejlmeddelelse, når jeg lukker enten client eller server?
2. Hvis jeg nu vil have dette til at køre over internettet (computer til computer uden LAN-forbindelse), hvordan skal jeg så connecte til min IP? Jeg har prøvet at sætte egenskaben client i Client til new TcpClient("127.0.0.1", 2000);, hvor 127.0.0.1 var både LAN- og WAN-adresserne, jeg fandt på http://www.ip-lookup.net/, men får en fejl om, at destinationen aktivt nægter det.

På forhånd tak.
Avatar billede zaknafein Praktikant
26. juni 2007 - 12:15 #1
til 2'eren, har du en router? Hvis skal du måske lige ind og sætte NAT op så port 2000 bliver mappen fra din externe IP til din interne.
Ellers er det måske et software firewall problem.
Avatar billede arne_v Ekspert
26. juni 2007 - 20:27 #2
re 1)

Kan du ikke bare catche exception ?
Avatar billede maqhem Nybegynder
27. juni 2007 - 13:17 #3
zaknafein
Jeg skal åbenbart lige have set i min manual, men den ved jeg ikke lige hvor er, så jeg ser, om jeg lige kan finde noget på nettet. Jeg takler dit som svar nok på mit ene spørgsmål, da der åbenbart kræves individuelle, forskellige løsninger til de forskellige routere. Smid du et svar, så får får du point, når jeg lige har afklaret resten.

arne_v
Hvor går jeg helt præcist det? Jeg har ikke arbejdet med exceptions før nemlig.
Avatar billede windcape Praktikant
29. juni 2007 - 05:19 #4
Avatar billede arne_v Ekspert
07. august 2007 - 22:29 #5
Kommet videre ?
Avatar billede maqhem Nybegynder
09. november 2008 - 19:56 #6
Alle sammen: smid et svar. Nu er det tid til at lukke biksen.
Avatar billede arne_v Ekspert
09. november 2008 - 20:04 #7
OK
Avatar billede zaknafein Praktikant
09. november 2008 - 21:34 #8
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