2017-01-21 9 views
1

Я могу установить связь между клиентом и сервером с использованием TCP/IP. Клиент и сервер могут отправлять и получать сообщения друг другу только в том случае, если сервер и клиент находятся в одной сети, если оба находятся в другой сети, а клиент не подключается к серверу. Что делать, если они находятся в другой сети? пожалуйста, помогите.Есть серверный и клиентский код. Спасибо.Клиентский сервер TCP/IP Связь по другой сети в C#

//Server Code 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 
using System.Net; 
using System.IO; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 

     try 
     { 
      IPAddress ipAd = IPAddress.Parse("192.168.0.110"); //use local  m/c IP address, and use the same in the client 

      /* Initializes the Listener */ 
      TcpListener myList = new TcpListener(ipAd, 8001); 

      /* Start Listeneting at the specified port */ 
      myList.Start(); 

      Console.WriteLine("The server is running at port 8001..."); 
      Console.WriteLine("The local End point is :" + myList.LocalEndpoint); 
      Console.WriteLine("Waiting for a connection....."); 

      Socket s = myList.AcceptSocket(); 
      Console.WriteLine("Connection accepted from " + s.RemoteEndPoint); 

      byte[] b = new byte[100]; 
      int k = s.Receive(b); 
      Console.WriteLine("Recieved..."); 
      for (int i = 0; i < k; i++) 
       Console.Write(Convert.ToChar(b[i])); 
      Console.WriteLine("Enter the string to be strasmitted"); 

      String str = Console.ReadLine(); 

      ASCIIEncoding asen = new ASCIIEncoding(); 
      s.Send(asen.GetBytes(str)); 
      Console.WriteLine("\nSent Acknowledgement"); 
      /* clean up */ 
      s.Close(); 
      myList.Stop(); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error..... " + e.StackTrace); 
     } 
     Console.ReadLine(); 
    } 

    } 
    } 

    //Client Code 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.IO; 
using System.Net.Sockets; 

namespace ConsoleApplication4 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      TcpClient tcpclnt = new TcpClient(); 
      Console.WriteLine("Connecting....."); 

      tcpclnt.Connect("192.168.0.110", 8001); // use the ipaddress as in the server program 

      Console.WriteLine("Connected"); 
      Console.Write("Enter the string to be transmitted : "); 

      String str = Console.ReadLine(); 
      Stream stm = tcpclnt.GetStream(); 

      ASCIIEncoding asen = new ASCIIEncoding(); 
      byte[] ba = asen.GetBytes(str); 
      Console.WriteLine("Transmitting....."); 

      stm.Write(ba, 0, ba.Length); 

      byte[] bb = new byte[100]; 
      int k = stm.Read(bb, 0, 100); 

      for (int i = 0; i < k; i++) 
       Console.Write(Convert.ToChar(bb[i])); 

      tcpclnt.Close(); 
     } 

     catch (Exception e) 
     { 
      Console.WriteLine("Error..... " + e.StackTrace); 
     } 
     Console.ReadLine(); 
    } 
    } 
} 

ответ

0

Сервер прослушивает соединения от 192.168.0.110 порта 8001

IPAddress ipAd = IPAddress.Parse("192.168.0.110"); 
TcpListener myList = new TcpListener(ipAd, 8001); 

клиент подключается к серверу с IP является: 192.168.0.110. Сервер находится в той же сети. Поэтому, если сервер включен и прослушивает соединение, это будет работать.

tcpclnt.Connect("192.168.0.110", 8001); 

Так что все нормально, но если ваш клиент находится на другой сети он не может найти сервер, конечно, потому что клиент будет искать IP: 192.168.0.110:8001 (локальный сервер IP) в локальной сети, и есть нет сервера, который будет слушать это.

Чтобы выполнить эту работу, вам необходимо будет перенаправить порт маршрутизатора в сеть вашего сервера. Установите в маршрутизаторе, что каждое входящее соединение на порту: 8001 будет перенаправлено на 192.168.0.110:8001 (локальный IP-адрес сервера).

Например, если ваш публичный IP является 10.10.10.10, чем вы должны позволить своему клиенту подключиться как это:

tcpclnt.Connect("10.10.10.10", 8001); 

Так что, если ваш клиент подключается к 10.10.10.10:8001 маршрутизатор перенаправляет его на сервер по локальной сети и клиента сможет подключиться к серверу.

/*Server example for listening. (IPAddress.any) means any IP will be allowed to connect*/ 
TcpListener myList = new TcpListener(IPAddress.Any,8001); 

!! Обратите внимание, как порт вперед для каждого маршрутизатора отличается, поэтому быстрый поиск Google поможет вам, как это сделать.

+0

Моя ошибка Я использовал тот же ip в клиентском и серверном коде, но неправильно разместил.и исправил мой вопрос только сейчас. Хотя я попробую ваше решение. –

+0

Нет проблем, я обновил свой код. но это решение должно работать, я делал это так же, но не с нокаутом. Поэтому мне будет интересно, как это работает. –

+0

@Timson Post все еще не работает. Я не занимался переадресацией портов, так как вы сказали, что у меня нет доступа к моему маршрутизатору. Есть ли другой способ, кроме переадресации портов, как делать некоторые изменения в файле хоста Windows. –