Jak najbardziej użyć klas TcpClient i TcpListener.
Chcesz, żeby twój serwer był dostępny na świat, tj. ludzie po twoim publicznym IP mogli się z nim połączyć. Co nie znaczy, że twój serwer ma nasłuchwiać na twoim publicznym IP. Ba, to jest niemożliwe. Mała znajomość podstaw działania sieci nie szkodzi. Otóż twój komputer jest w sieci lokalnej (powiedzmy 192.168.0.0). Gdy chce pogadać ze światem zewnętrznym to gada do swojego gateway'a, czyli twojego router'a (to będzie 192.168.0.1) i on przepuszcza tą wiadomość przez maskaradę i to sobie leci w świat. Jeżeli chcesz, żeby to działało w drugą stronę, tj. żeby świat zewnętrzny mógł gadać do twojego komputera, to na routerze musisz mieć ustawiony port forwarding. To działa tak, że jak na twój publiczny adres IP (czyli nota bene adres twojego router'a) na konkretny port (powiedzmy 1337) przyjdzie jakaś wiadomość to twój router prześle tą wiadomość do twojego komputera (powiedzmy 192.168.0.2).
Jak ustawić port forwarding to już ci wujek podpowie.
A tu masz przykładowy kod serwera:
Kopiuj
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
class ExampleServer
{
static void Main(string[] args)
{
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.0.2"), 1337); //klient nasłuchuje w sieci lokalnej, jeżeli przyjdzie coś z zewnątrz to router to tutaj przepcha
TcpListener listener = new TcpListener(ipEndPoint);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
NetworkStream stream = client.GetStream();
BinaryWriter writer = new BinaryWriter(stream);
BinaryReader reader = new BinaryReader(stream);
Console.WriteLine(reader.ReadString());
writer.Write("response");
Console.ReadLine();
client.Close();
listener.Stop();
}
}
I kod klienta:
Kopiuj
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
class ExampleClient
{
static void Main(string[] args)
{
TcpClient client = new TcpClient("80.120.20.220", 1337); //klient nadaje na IP publiczne, czyli IP router'a
NetworkStream stream = client.GetStream();
BinaryWriter writer = new BinaryWriter(stream);
BinaryReader reader = new BinaryReader(stream);
writer.Write("test");
Console.WriteLine(reader.ReadString());
Console.ReadLine();
client.Close();
}
}