我能够使用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();
}
}
}
答案 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
!!注意如何端口转发是针对每个路由器的不同,所以快速搜索谷歌将帮助您如何做到这一点。