Подключение к удаленному хосту и чтение данных с использованием C # - PullRequest
0 голосов
/ 24 августа 2011

У меня есть сервер, который передает данные через порт TCP после подключения к нему. Вы можете увидеть это, если подключитесь к TCP-порту и начнете передавать данные.

Я ищу пример, который позволит мне подключиться к IP-адресу и порту и получить данные в потоке в приложении.

Все примеры, которые я могу найти, относятся к модели клиент-сервер с отправкой клиентом (а это не то, что мне нужно) и привязкой сервера к самому порту и получению.

Мне нужно, чтобы это было асинхронно, и я верю, что это можно сделать, но я могу сделать это с хорошей ногой!

1 Ответ

5 голосов
/ 24 августа 2011

Если вы используете TcpClient, используйте GetStream для получения NetworkStream, а затем используйте поток для чтения данных, отправленных сервером. Вы всегда можете использовать поток асинхронно, используя BeginRead.

Если вы используете обычный старый Socket, вы можете использовать BeginReceive для асинхронного приема после подключения.

В любом случае, как только у вас есть объект NetworkStream или Socket, который связан и подключен, между сервером и клиентом нет никакой разницы. Вы можете использовать пример чтения с сервера в коде клиента, чаще всего без (или небольшого) изменения.

Для примера:

byte[] readBuffer = new byte[1000]; 

{
    TcpClient tcpClient = new TcpClient(serverHost, serverPort);
    NetworkStream stream = tcpClient.GetStream();

    stream.BeginRead(readBuffer, 0, 1000, readHandler, tcpClient);
}

...

byte[] tempBuff = new byte[1000];
int tempBuffSize = 0;

// This is a rough example of reading and handling data
// that is delimited by \r\n. This code most probably is
// missing many edge case handling, so use it only as a starting
// point
void readHandler(IAsyncResult result)
{
    TcpClient tcpClient = (TcpClient)result.AsyncState;
    int dataLen = tcpClient.GetStream().EndRead();

    int currStart = 0;
    int currEnd = -1;

    for (int i = 0; i < dataLen; i++)
    {
        if (readBuffer[i] == '\r' && i < (readBuffer.Length - 1) &&
            readBuffer[i + 1] == '\n')
        {
            // Set the end of the data
            currEnd = i - 1;

            // If we have left overs from previous runs:
            if (tempBuffSize != 0)
            {
                // Allocate enough space for the joined buffer
                byte[] joinedData = new byte[tempBuffSize + (currEnd - currStart + 1)];

                // Get the leftover from the previous read
                Array.Copy(tempBuff, 0, joinedData, 0, tempBuffSize);

                // And add the current read as well
                Array.Copy(readBuffer, currStart, joinedData, tempBuffSize, (currEnd - currStart + 1));

                // Now handle it
                HandleData(joinedData, 0, joinedData.Length);

                // Mark that we don't have any leftovers anymore
                tempBuffSize = 0;
            }
            else
            {               
                // Handle the data, from the start to the end, between delimiter
                HandleData(readBuffer, currStart, currEnd);
            }

            // Set the new start - after our delimiter
            currStart = i + 2;
        }
    }

    // See if we still have any leftovers
    if (currStart < dataLen)
    {
        Array.Copy(readBuffer, currStart, tempBuff, 0, dataLen - currStart);
        tempBuffSize = dataLen - currStart;
    }

    // Set the asynchronous read again
    stream.BeginRead(readBuffer, 0, 1000, readHandler, tcpClient);
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...