Запись данных, полученных через сокет, в файл - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь собрать данные с IP-адреса и порта с помощью TCP-клиента или сокета, но не могу найти способ успешно записать то, что я получаю, либо на консоль, либо в файл.Из многочисленных источников, которые я просматривал в Интернете, включая документацию MSDN и различные блоги, я нашел этот наиболее понятным, но он по-прежнему ничего не записывает в консоль, и я знаю IP-адрес / порт (который я могуне делюсь) должен посылать мне поток данных.

Что я делаю не так?

using System;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace TCPIPChallenge
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Client client = new Client();
            client.SetupServer();
        }
    }

    public class Client
    {

        private Socket _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private byte[] _recieveBuffer = new byte[8142];

        private void SetupServer()
        {
            try
        {
            _clientSocket.Connect(new IPEndPoint(IPAddress.Parse("0.0.0.0"), 8888));
            Console.WriteLine("It was successful!");
        }
        catch (SocketException ex)
        {
            Console.WriteLine("There was an issue...");
            Debug.Write(ex.Message);
        }
        Console.WriteLine(_clientSocket.Connected);
        _clientSocket.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);

    }

    private void ReceiveCallback(IAsyncResult AR)
    {
        //Check how much bytes are recieved and call EndRecieve to finalize handshake
        int recieved = _clientSocket.EndReceive(AR);
        Console.WriteLine(_clientSocket.Connected);
        if (recieved <= 0)
            return;

            //Copy the recieved data into new buffer , to avoid null bytes
            byte[] recData = new byte[recieved];
            Buffer.BlockCopy(_recieveBuffer, 0, recData, 0, recieved);

            //Process data here the way you want , all your bytes will be stored in recData
            Console.WriteLine(recData.ToString());

            //Start receiving again
            _clientSocket.BeginReceive(_recieveBuffer, 0, _recieveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Это похоже на подозрение:

Console.WriteLine(recData.ToString());

Вы не можете просто вызвать ToString в байтовом массиве, ожидая, что он превратится в строку, потому что есть много разныхтипы кодирования, которые могут преобразовывать байты в строку и наоборот.Некоторое кодирование занимает больше байтов, чем другие, например UTF-8 и UTF-16.

Пример использования кодировки Unicode

Преобразование вашего сообщения в байты:

byte[] data = System.Text.Encoding.Unicode.GetBytes("Hello!");

Повторное отображение данных:

byte[] recData = new byte[recieved];
string message = System.Text.Encoding.Unicode.GetString(recData);
Console.WriteLine(message); // "Hello!"

Убедитесь, что вы используете одинаковую кодировку на стороне сервера и клиента для получения согласованных данных.

Разноетипы кодирования: UTF-8, UTF-16 и UTF-32

0 голосов
/ 12 июня 2018

Кажется, вы не ожидаете отображения результата.Поместите Console.Read ();в вашем главном.

public static void Main(string[] args)
        {
            Client client = new Client();
            client.SetupServer();
            Console.Read();
        }
...