c# - 服务器没有响应传入的连接
问题描述
我正在用 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");
}
}
我究竟做错了什么?任何帮助表示赞赏。
解决方案
推荐阅读
- maven - Maven:使用
作为 - r - R中的循环(Bioconductor ALL数据集)
- google-cloud-firestore - Firestore + Cloud Functions:日期行为已更改,您的应用程序可能会中断
- shell - 捕获 shell 输出时 Chef 编译错误
- python - 强制 for 循环以相同的线开始
- ios - 我可以使用 NSInvocation 隐藏或显示子类 UIView 而不重绘它吗?
- c# - Best Way to Monitor Types in DLL Files
- java - 如何在 Android 应用程序中拍摄正方形大小的照片
- javascript - 为什么“这个”突然超出了我的范围?
- c# - Active Directory 中 UserPrincipal 对象的 GUID 属性是否唯一且不可欺骗?