TCP / IP客户端服务器c#中不同网络的通信

时间:2017-01-21 09:35:27

标签: c# sockets networking tcp-ip

我能够使用TCP / IP在客户端和服务器之间建立通信。只有当服务器和客户端在同一网络中时,如果服务器和客户端在不同的网络中,则客户端无法连接,客户端和服务器之间可以相互发送和接收消息。 server。当他们在不同的网络时应该怎么做?请帮忙。这是服务器和客户端代码。谢谢。

//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();
     }
    }
 }

1 个答案:

答案 0 :(得分:0)

您的服务器正在侦听来自d<- data.frame(Period =c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), SalesForecasts = c(100, 100, 200, 100, 300, 300, 100, 100, 200, 300,100, 100, 500, 500, 1000, 500, 1500, 1500, 500, 500, 1000, 1500, 500, 500)) 端口192.168.0.110

的连接
8001

客户端使用IP连接到服务器:IPAddress ipAd = IPAddress.Parse("192.168.0.110"); TcpListener myList = new TcpListener(ipAd, 8001); 。服务器位于同一网络上。因此,如果服务器已启用并正在侦听连接,则此功能将起作用。

192.168.0.110

所以一切都很好但是如果你的客户在不同的网络上,它当然找不到服务器,因为客户端会在本地网络中寻找IP:tcpclnt.Connect("192.168.0.110", 8001); (本地服务器IP),没有服务器会听取它。

因此,为了完成这项工作,您必须在服务器网络上转发路由器。在路由器中设置端口上的每个传入连接:192.168.0.110:8001将重定向到8001(本地服务器IP)。

例如,如果您的公共IP是192.168.0.110:8001,那么您应该让客户端像这样连接:

10.10.10.10

因此,如果您的客户端连接到tcpclnt.Connect("10.10.10.10", 8001); ,路由器会将其重定向到本地网络上的服务器,客户端将能够连接到服务器。

10.10.10.10:8001

!!注意如何端口转发是针对每个路由器的不同,所以快速搜索谷歌将帮助您如何做到这一点。