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.