我有一个非常烦人的问题:我正在使用 C# 开发一个协作文本编辑器,我希望列表中的每个客户端都编辑共享文本框,但是我被键盘转换中的字符卡住了。下面是 keyDown 事件的代码:
private void downKey(object sender, KeyEventArgs e)
{
try
{
byte[] data;
switch (e.KeyCode)
{
case Keys.Enter: data = Encoding.UTF8.GetBytes("enter");
break;
case Keys.Back: data = Encoding.UTF8.GetBytes("backspace");
break;
case Keys.Space: data = Encoding.UTF8.GetBytes("space");
break;
default:
data = Encoding.UTF8.GetBytes(e.KeyCode.ToString().ToLower());
break;
}
TcpClient.GetStream().Write(data, 0, data.Length);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
现在,连接到应用程序的客户端列表中的每个客户端都应该接收带有文本框输入的字节数组。因此,在每个客户端的“OnDataReceived”回调中,将此字节数组转换为字符串并尝试通过 crossThreadDelegate 更新文本框每个客户。
public void OnDataReceived(IAsyncResult asyn)
{
try
{
TcpSpecificPacket theSockId = (TcpSpecificPacket)asyn.AsyncState;
int dataReceivedLength = theSockId.thisClient.GetStream().EndRead(asyn);
if (dataReceivedLength != 0)
{
textBoxArrived.Invoke(changeCrossTextBox, new object[] {Encoding.UTF8.GetString(theSockId.dataBuffer, 0, dataReceivedLength)});
WaitForData();
}
}
catch (IOException)
{
}
现在是 crossThread 委托的定义:
private void changeCrossTextBox(string mesaj)
{
if (mesaj.Equals("enter"))
{
textBoxArrived.Text += Environment.NewLine;
}
else if (mesaj.Equals("space"))
{
textBoxArrived.Text += " ";
}
else if (mesaj.Equals("backspace"))
{
textBoxArrived.Text = textBoxArrived.Text.Substring(0, textBoxArrived.Text.Length - 1);
}
else
{
textBoxArrived.Text += mesaj;
}
}
但我真正的问题是下一个:我无法很好地识别转义字符,因为我发送了一个字节数组,我将其转换为字符串,然后我尝试使用该字符串更新每个客户端的文本框。例如,当我按下 shift 键时,客户端的所有 TextBox 中的字符串将是“shiftKey”。你能告诉我如何处理这些转义字符吗?有没有一种方法可以用 ASCII 发送和更新。