首页 > 解决方案 > 服务器没有响应传入的连接

问题描述

我正在用 C# 编写一个 Connect-Four 游戏,现在想要包括使用 TCP 在线玩游戏的可能性。游戏 exe 的每个实例都应作为服务器工作,以便收听传入的游戏邀请,并作为客户端工作,以发送所述邀请。当然,一次只有一个很重要。

我已经阅读并观看了一些关于此的 C# 教程(即Jeff Chastine的教程 22),并且我了解网络通信的基础知识。在通过以管理员身份执行修复了一些权限错误之后,我现在遇到了两个问题。

1)当我尝试从同一网络上的机器连接时,我总是收到错误消息,指出所需的服务器没有响应请求。当我进入调试器时,程序卡在 .AcceptTcpClient 调用(好像没有尝试连接)。我知道这是一个阻塞调用,但是在尝试连接时代码应该继续。我没有尝试连接不同网络中的两台机器,因为我只有一个网络可用。

2)这是关于线程的一个相当小的问题:即使我在关闭应用程序时调用 listenerThread.Abort() ,线程也不会停止。我对 C# 中的线程没有太紧的把握,所以我认为这个问题是一个相当容易解决的问题。

listener 和 listenerThread 的初始化

listenerThread = new Thread(ListenForInvites);
listener = new TcpListener(Dns.Resolve("localhost").AddressList[0], setting.port);
client = new TcpClient();

监听传入连接的方法

private void ListenForInvites()
{
    try
    {
        listener.Start();
        TcpClient enemyClient = listener.AcceptTcpClient(); // the call where it gets stuck even if someone connects
        onlineSr = new StreamReader(enemyClient.GetStream());
        onlineSw = new StreamWriter(enemyClient.GetStream());

        onlineSw.WriteLine($"ACCEPT {player.name} {player.color.R} {player.color.G} {player.color.B}"); // I am using my own protocol, not HTTP (no clue if this is a horrible idea)
        HandleConnection().Wait();
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message, "Error");
    }
}

尝试连接的方法

public void SendInvite(string ip)
{
    try
    {
        string[] ipSplit = ip.Split(':');
        client.Connect(ipSplit[0], Convert.ToInt16(ipSplit[1]));
        onlineSr = new StreamReader(client.GetStream());
        onlineSw = new StreamWriter(client.GetStream());

        onlineSw.WriteLine($"INVITE {player.name} {player.color.R} {player.color.G} {player.color.B}"); // player is an instance variable
        onlineSw.Flush();

        HandleConnection().Wait();
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message, "Fehler");
    }
}

我究竟做错了什么?任何帮助表示赞赏。

标签: c#tcpnetwork-programming

解决方案


推荐阅读