服务器未响应传入连接

时间:2019-06-08 13:12:31

标签: c# tcp network-programming

我正在用C#编写“四人在线”游戏,现在想包括使用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");
    }
}

我在做什么错?任何帮助表示赞赏。

0 个答案:

没有答案