在等待用户输入时用C#同步读写套接字编程

时间:2014-11-30 10:07:07

标签: c# multithreading sockets tcp synchronous

我有两个C#程序通过TCP / IP同步通信进行交互。我使用的基本库之一是System.Net.Sockets。服务器以C#Windows格式编写,而客户端仅在控制台中。后者是这样的,因为它将与微控制器连接,因此以Windows形式使用它很可能是不可能的,也是不必要的。

我已成功将数据从服务器发送到客户端。现在,一旦您按下某些键,我就会致力于将数据从客户端发送到服务器。我使用密钥用于模拟目的,因为提供数据的设备是指纹扫描仪,条形码阅读器和磁力锁。例如,一旦按下数字1,程序就会发送数据。我已经使用硬编码成功地将数据从客户端发送到服务器。我的问题是在客户端套接字上进行同步读取和写入。

在两个C#程序中,read()都是线程化的。对于服务器,只要您按下按钮,就会激活write();对于客户端,一旦你按下键盘上的一个键。

我已经阅读了不同的论坛和应用方法,例如使用Console.KeyAvailabledelegate,线程,但我无法正确执行它们。我对后两者几乎没有成功,但对于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
        }
    }
}

问题是,如何同步这两件事?

  • 等待用户输入然后写入套接字
  • 从插座中聆听/阅读

感谢任何帮助。谢谢!

0 个答案:

没有答案