Как сериализовать медиа-объекты (аудио и изображения) для передачи через сокет? - PullRequest
1 голос
/ 15 ноября 2011

Я хочу, чтобы мое приложение могло общаться с ПК-клиентом через сокеты.Я уже знаю, как это сделать для строк.

Мой вопрос здесь, я хочу иметь возможность отправлять аудиофайлы и изображения, как я могу преобразовать файл iamge / audio в поток строк / бит и отправить его?

Вот мой класс для сокета:

public class SocketClient
{
    Socket socket = null;
    static ManualResetEvent clientDone = new ManualResetEvent(false);
    const int TIMEOUT_MILLISECONDS = 5000;
    const int MAX_BUFFER_SIZE = 2048;

    public SocketClient()
    {
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    }

    public string Send(string serverName, int portNumber, string data)
    {
        string response = "Timeout";

        if (socket != null)
        {
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
            socketEventArg.RemoteEndPoint = new DnsEndPoint(serverName, portNumber);

            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
            {
                response = e.SocketError.ToString();
                clientDone.Set();
            });

            byte[] payload = Encoding.UTF8.GetBytes(data);
            socketEventArg.SetBuffer(payload, 0, payload.Length);
            clientDone.Reset();
            socket.SendToAsync(socketEventArg);

            clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        }
        else
        {
            response = "not initialized";
        }
        return response;
    }

    public string Recieve(int portNumber)
    {
        string response = "Timeout";

        if (socket != null)
        {
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
            socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);

            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
            {
                if (e.SocketError == SocketError.Success)
                {
                    response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                    response.Trim('\0');
                }
                else
                {
                    response = e.SocketError.ToString();
                }

                clientDone.Set();
            });

            socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, portNumber);

            clientDone.Reset();
            socket.ReceiveFromAsync(socketEventArg);
            clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        }

        return response;
    }

    public void Close()
    {
        socket.Close();
    }
}

Я хочу изменить его, чтобы можно было отправлять изображения и аудиофайлы.

1 Ответ

2 голосов
/ 15 ноября 2011

Ваш текущий метод отправки использует строковое свойство для данных. Вы можете восстановить это, используя байтовый массив или поток, содержащий данные.

Вы можете использовать этот пример, чтобы увидеть, как перейти от изображения к потоку и обратно, хотя здесь используются не сокеты, а локальное хранилище. Принцип того, как это сделать, остается неизменным: http://blogs.microsoft.co.il/blogs/tomershamam/archive/2010/10/12/saving-and-loading-captured-image-to-and-from-wp7-isolated-storage.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...