Отправка случайно сгенерированного байтового массива с клиента на сервер по протоколу TCP / IP. - PullRequest
0 голосов
/ 08 октября 2018

У меня есть массив, в котором количество элементов генерируется случайным образом от 1 до 11, а значения также генерируются случайным образом от 0 до 254. Я хотел бы отправить эти значения с клиента на сервер и записать исходный массивзначения с Console.WriteLine().Я пытался в течение нескольких дней, и я пробовал много вариантов, но я не мог решить эту проблему.Я поделился кодом, который, как мне кажется, был самым близким, но сервер отправил ошибку, подобную этой: «Ввод не является допустимой строкой Base-64, так как она содержит неосновной 64-символ, более двух символов заполнения или несимвол пробела среди дополнительных символов ». После этого я попытался заменить (« - »,« + ») на (« _ »,« / »), но это не сработало.Программа клиента:

static void Main(string[] args)
{
    Random rnd = new Random();
    byte[] array = new byte[rnd.Next(1, 11)];
    for (int i = 0; i < array.Length; ++i)
    {
        array[i] = (byte)rnd.Next(255);
        Console.WriteLine(array[i]);
    }
    System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
    clientSocket.Connect("111.11.11.111", 8888);
    while (true)
    {
        NetworkStream serverStream = clientSocket.GetStream();
        string str = Convert.ToBase64String(array);
        byte[] outStream = System.Text.Encoding.UTF8.GetBytes(str);
        serverStream.Write(outStream, 0, outStream.Length);
        serverStream.Flush();               
    }
}

Программа сервера:

IPAddress ipAd = IPAddress.Parse("111.11.11.111");
TcpListener serverSocket = new TcpListener(ipAd, 8888);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
Console.WriteLine("*****Server started*****");
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine("Accepted connection from client");

while(true)
{
    try
    {
        NetworkStream networkStream = clientSocket.GetStream();
        byte[] bytesFrom = new byte[10025];
        if(networkStream.DataAvailable)
        {
            networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
            string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);      
            byte[] decByte = Convert.FromBase64String(dataFromClient);
            foreach (var item in decByte)
            {
                Console.WriteLine(item.ToString());
            }
            networkStream.Flush();                     
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

Этот код прекрасно работает в том же консольном приложении, но, вероятно, он не работает между клиентом исервер:

string str = Convert.ToBase64String(array);
Console.WriteLine(str);
byte[] decByte = Convert.FromBase64String(str);
Console.WriteLine(decByte[0]);

Я мог бы слишком усложнить все это, но в конце я так запутался.Мне даже нужно кодировать, если у меня уже есть байтовый массив?Может ли кто-нибудь показать мне самый простой способ или способы, как это можно сделать?Заранее благодарю за ваше время и помощь.

1 Ответ

0 голосов
/ 08 октября 2018

Первая проблема, которую я заметил, заключается в том, что в коде вашего сервера вы вызывали UTF8.GetString, используя весь буфер вместо указания количества байтов, которые вы фактически получили.Измените это:

networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);

На это:

var receivedCount = networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom, 0, receivedCount);

Однако вы в конечном итоге столкнетесь с другой проблемой, поскольку сообщения иногда становятся фрагментированными, и ваш дизайн не содержит какого-либо метода для сигнализациичто все сообщение было получено или нет.Вам нужно будет поставить разрыв строки в конце каждого сообщения, или префикс сообщения с ожидаемым общим размером, или что-то , чтобы сервер знал, когда все данные были получены.Вы не можете ожидать, что все придет целым.

...