我正在我的服务器上运行一个套接字服务器,我醒来时发现了许多有关其无法访问的消息.事实证明,在我上床睡觉之前,我在窗口中突出显示了一个IP地址,忘记按Enter键以恢复该过程.
这就是我现在在控制台中禁用选择的方法,但我仍然希望能够在没有应用程序暂停的情况下进行选择.
#region Disable Quick-Edit Mode
[DllImport("kernel32.dll")]
static extern bool SetConsoleMode(IntPtr hConsoleHandle, int mode);
[DllImport("kernel32.dll")]
static extern bool GetConsoleMode(IntPtr hConsoleHandle, out int mode);
[DllImport("kernel32.dll")]
static extern IntPtr GetStdHandle(int handle);
const int STD_INPUT_HANDLE = -10;
const int ENABLE_EXTENDED_FLAGS = 0x80;
public static void DisableQuickEditMode()
{
int mode;
IntPtr handle = GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(handle, out mode);
mode |= ENABLE_EXTENDED_FLAGS;
SetConsoleMode(handle, mode);
mode &= ~ENABLE_QUICK_EDIT;
SetConsoleMode(handle, mode);
}
Run Code Online (Sandbox Code Playgroud)
我真的不想回到命令提示符的传统模式,因为它确实有助于拥有这些新功能(特别是开发人员),但我需要找到一种方法来阻止应用程序在我暂停时停止安慰.有趣的是,当我今天早上点击Enter时,处理了所有已尝试的连接,然后在处理它们之后,它们被丢弃.这让我想知道,或许,我正在编写错误的应用程序; 我需要一个"控制台"线程和一个"服务器"线程.但我不确定这甚至会有所作为.
我一直在玩网络套接字,我的大多数问题都来自Windows Forms,但是我已经研究了很多程序,比如私有服务器模拟器,我对我的数据包处理感到不满意.
每个消息都以JSON格式化,如下所示:
{
"id":201,
"Message":"Hello, World.",
"User":"System",
"Color":"LawnGreen"
}
Run Code Online (Sandbox Code Playgroud)
"id"是所有数据包中的常量,它将识别数据包的功能.具有相同ID的数据包(以下称为标题)将始终具有相同的键,但不一定具有相同的值(duh,有人说).
我将JSON反序列化为动态并在数据包的标题上执行切换案例,如下所示:
switch((int)jsonPacket.id)
{
case 201:
...
}
Run Code Online (Sandbox Code Playgroud)
鉴于这是一个非常小规模的聊天应用程序,甚至几乎没有开始尝试和实现所有IRC的功能,我是否仍然应该关注并不满意我的实现?小型游戏/测试台服务器使用相同的方法,但我不想在功能和性能方面限制自己,或者如果它变得令人讨厌.
任何想法都会有帮助.