我有两个C#程序通过TCP / IP同步通信进行交互。我使用的基本库之一是System.Net.Sockets
。服务器以C#Windows格式编写,而客户端仅在控制台中。后者是这样的,因为它将与微控制器连接,因此以Windows形式使用它很可能是不可能的,也是不必要的。
我已成功将数据从服务器发送到客户端。现在,一旦您按下某些键,我就会致力于将数据从客户端发送到服务器。我使用密钥用于模拟目的,因为提供数据的设备是指纹扫描仪,条形码阅读器和磁力锁。例如,一旦按下数字1
,程序就会发送数据。我已经使用硬编码成功地将数据从客户端发送到服务器。我的问题是在客户端套接字上进行同步读取和写入。
在两个C#程序中,read()
都是线程化的。对于服务器,只要您按下按钮,就会激活write()
;对于客户端,一旦你按下键盘上的一个键。
我已经阅读了不同的论坛和应用方法,例如使用Console.KeyAvailable
,delegate
,线程,但我无法正确执行它们。我对后两者几乎没有成功,但对于Console.KeyAvailable
,我可以在套接字上写入和读取,但同步时会出现错误。
这是我的send()
和receive()
客户代码。
//********************SEND DATA TO CLIENT********************
static void sendToClient()
{
if (client.Connected)
{
sendBuffer = new Byte[1024];
try
{
device = Console.Read();
#region Data to send per device
switch (device)
{
case 1: // barcode
{
dataToSend = "bar1234";
}
break;
case 2: // fingerprint
{
dataToSend = "fingerprint5678";
}
break;
case 3: // lock
{
dataToSend = "lock8910";
}
break;
default:
break;
}
#endregion
sendStream = client.GetStream();
sendBuffer = Encoding.ASCII.GetBytes(dataToSend);
sendStream.Write(sendBuffer, 0, sendBuffer.Length);
Console.WriteLine("Data sent!");
Console.Clear();
sendStream.Flush();
}
// insert catch statements
}
}
//********************RECEIVE DATA FROM CLIENT********************
static void receiveFromClient()
{
receiveStream = client.GetStream();
try
{
sendToClient();
strReceivedData = new StringBuilder();
receiveBuffer = new Byte[1024];
while(client.Connected)
{
while (!(Console.KeyAvailable))
{
try
{
byteRead = receiveStream.Read(receiveBuffer, 0, receiveBuffer.Length);
}
// insert catch statements
strReceivedData.AppendFormat("{0}", Encoding.ASCII.GetString(receiveBuffer, 0, byteRead));
Console.WriteLine(strReceivedData.ToString());
strReceivedData.Clear();
receiveStream.Flush();
}
if (Console.KeyAvailable)
sendToClient();
}
}
// insert catch statements
}
}
}
问题是,如何同步这两件事?
感谢任何帮助。谢谢!