我正在开发一个服务器客户端应用程序。哪个服务器和客户端在同一主机上运行。主持人有两个网站。服务器正在其中一个nic的ip上运行,而客户端已绑定到其他nic的ip。服务器和客户端的相应代码如下。
服务器代码:
命名空间服务器 { 课程 { static void Main(string [] args) { Console.WriteLine(“服务器运行并等待.....”);
// Create Server Socket to recive
try
{
IPAddress ipAddress = IPAddress.Parse("192.0.0.4");
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 2700);
TcpListener Ls = new TcpListener(ipLocalEndPoint);
Ls.Start();
while (true)
{
Socket soc = Ls.AcceptSocket();
//soc.SetSocketOption(SocketOptionLevel.Socket,
// SocketOptionName.ReceiveTimeout,10000);
try
{
Stream s = new NetworkStream(soc);
StreamReader sr = new StreamReader(s);
StreamWriter sw = new StreamWriter(s);
sw.AutoFlush = true; // enable automatic flushing
sw.WriteLine("{0} Number of employee", ConfigurationManager.AppSettings.Count);
while (true)
{
string name = sr.ReadLine();
Console.WriteLine("name {0}",name);
sw.WriteLine("entered name {0}", name);
if (name == "" || name == null) break;
string job = ConfigurationManager.AppSettings[name];
if (job == null) job = "No such employee";
sw.WriteLine(job);
}
s.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
soc.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
while (true)
{ }
}
}
}
}
客户代码
公共课堂 {
public static void Main()
{
try
{
IPAddress ipAddress = IPAddress.Parse("192.0.0.5");
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 8000);
TcpClient tcpclnt = new TcpClient(ipLocalEndPoint);
Console.WriteLine("Connecting.....");
tcpclnt.Connect("192.0.0.4", 2700);
// 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 (SocketException e)
{
Console.WriteLine("Error..... " + e.ErrorCode);
}
while(true)
{}
}
}
什么代码并不重要。只有连接部分才是关注点。
当我使用没有任何参数的构造函数“TcpClient”时。我的意思是更换以下三行客户端 IPAddress ipAddress = IPAddress.Parse(“192.0.0.5”); IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress,8000); TcpClient tcpclnt = new TcpClient(ipLocalEndPoint); 同 TcpClient tcpclnt = new TcpClient(); 它工作正常。
或
当客户端在不同的机器上运行时,它也正常工作。
答案 0 :(得分:0)
后人: 使用TcpClient()
允许底层服务提供商分配最合适的 本地IP地址和端口号
(来源:https://msdn.microsoft.com/en-us/library/zc1d0e0f%28v=vs.110%29.aspx),这就是它起作用的原因。
通过调用TcpClient(IPEndpoint)
重载来分配端点会强制它到特定的NIC,地址和端口。如果没有从该IPEndpoint到服务器端点的网络路由,则无法建立连接。除非涉及组合,否则在同一网络上的同一台机器上安装两个NIC通常被认为是不好的做法。 192.0.0.4
和192.0.0.5
是问题,将NIC放在不同网络上并在它们之间建立路由可以在客户端指定或不指定本地端点。