【发布时间】:2014-06-16 21:38:23
【问题描述】:
我的主笔记本电脑和另一台笔记本电脑上都有通用 TCP 客户端和 TCP 侦听器设置。客户端和侦听器是他们自己的独立程序,因此我在两台笔记本电脑上都运行了一个客户端和服务器,以尝试让一个简单的即时通讯工具运行。
如果两个程序都在同一台笔记本电脑上执行,客户端和服务器将愉快地通信。这对于我的主笔记本电脑和其他笔记本电脑都是如此。
我的主笔记本电脑的客户端将愉快地向我的另一台笔记本电脑发送消息,而另一台笔记本电脑将优雅地接收来自我的主笔记本电脑的消息 笔记本电脑。
但是,当我的另一台笔记本电脑的客户端向我的主笔记本电脑的服务器发送消息时,它会收到与超时相关的通信失败类型的错误。它只是不发送消息。
Error message (caught by try-catch); "连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应{我的 IP:端口号}。”
我得到的 IP 和端口号是正确的,所以排除它。 没有防火墙业务,因为另一台笔记本电脑根本不关心从我的主笔记本电脑接收消息。
我还尝试了随机端口号,并确保我的主笔记本电脑上的客户端正在通过我的另一台笔记本电脑的服务器正在侦听(或接受来自)的相同端口号进行连接。
那么为什么我的另一台笔记本电脑没有成功向我的主笔记本电脑发送消息?
客户端要求用户输入 IP,然后输入端口号。然后它等待用户输入消息,然后通过给定的端口号连接并将该消息发送到 IP。
服务器要求用户输入端口号并打印通过该端口接收到的消息。
这是客户端程序的代码;
static void Main(string[] args)
{
string IP = localIPAddress();
Console.WriteLine("Your IP: " + IP); //provides IP number
Console.Write("Enter IP to connect to: ");
string connectToIP = Console.ReadLine();
if (connectToIP == "self")
{
connectToIP = localIPAddress();
// if I want to test both on the same computer
}
Console.WriteLine("\nEnter port number: ");
int portNo = int.Parse(Console.ReadLine());
while (true)
{
string message = Console.ReadLine();
try
{
// connection doesn't begin until ReadLine is done
request(connectToIP, portNo, message);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
public static string localIPAddress()
{
IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
localIP = ip.ToString();
}
}
return localIP;
}
static void request(string address, int port, string message)
{
TcpClient client = new TcpClient();
client.SendTimeout = 1000;
client.ReceiveTimeout = 1000;
try
{
client.Connect(address, port);
StreamWriter sw = new StreamWriter(client.GetStream());
sw.WriteLine(message);
sw.Flush();
sw.Close();
}
catch (Exception a)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(a.Message.ToString());
Console.ResetColor();
}
}
这是服务器的代码;
static void Main(string[] args)
{
Console.WriteLine("Your IP: " + localIPAddress());
Console.Write("Enter port number you're receiving from: ");
int portNo = int.Parse(Console.ReadLine());
TcpListener listener = new TcpListener(IPAddress.Any, portNo);
Socket connection;
NetworkStream socketStream;
listener.Start();
while (true)
{
connection = listener.AcceptSocket();
connection.SendTimeout = 1000;
connection.ReceiveTimeout = 1000;
socketStream = new NetworkStream(connection);
try
{
respond(socketStream);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
socketStream.Close();
connection.Close();
}
}
}
public static string localIPAddress()
{
IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
localIP = ip.ToString();
}
}
return localIP;
}
static void respond(NetworkStream strm)
{
List<string> sentIn = new List<string>();
StreamReader sr = new StreamReader(strm);
while (sr.Peek() != -1)
sentIn.Add(sr.ReadLine());
sr.Close();
foreach (string s in sentIn)
{
Console.WriteLine(s);
}
}
我的代码有问题吗?当任何一台笔记本电脑使用这些程序时,都没有与防火墙相关的消息。
它可能是客户端的 sw.Flush(),因为它曾经导致发送过程冻结。
提前致谢。一旦我解决了这个问题,我就会开始想知道如何使用它来制作多人 XNA 游戏。
【问题讨论】:
标签: c# tcp connection