首页 > 解决方案 > C#通过Socket同时发送字符串和视频流

问题描述

我在 C# 中使用套接字通过网络发送字符串。我正在发送字符串没有任何问题,但我试图同时在字节数组中使用字符串流式传输视频。换句话说,我想将两个字节数组作为一条消息发送。

为什么我需要它?我需要将它流式传输给特定用户,我这样做的方式是在字符串中指定应该接收视频的用户名,第二个字节数组将被该用户接受,其他任何人都不会接受。

我使用以下代码发送字符串:

public static void Send(string text) //Send String to the Server
    {
        try
        {
            byte[] buffer = Encoding.UTF32.GetBytes(text);
            Main.AppControls.ClientSocket.Send(buffer, 0, buffer.Length, SocketFlags.None);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex);
        }
    }

我想知道是否有可能做这样的事情来使一个发送功能不是分开而是作为一个。

public static void Send(string text) //Send String to the Server
    {
        try
        {
            byte[] buffer = Encoding.UTF32.GetBytes(text, byteVideoStream); <---- THIS IS WHAT I NEED
            Main.AppControls.ClientSocket.Send(buffer, 0, buffer.Length, SocketFlags.None);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex);
        }
    }

显然,如果我只用视频流传输一个字节数组并在服务器端接收它,我将无法指定接收它的人。但是,如果使用字符串它有第二个字节数组,我可以导航到将接收它的用户。

更新我已经在发送者和接收者之间建立了协议当服务器接收到一个字符串字节数组时,它将读取第一个单词,如果它包含例如“连接”,那么服务器将其传递给所有客户端:

if (_function== "Connect") // Client Sending Connection
   {
   foreach (Socket _connectedUsers in Server.clientSockets) //Send message back to everyone but accepts only this user.
           {
             byte[] data = Encoding.UTF32.GetBytes("Connected" + "-" + "UserName"); //Passing Message to Other Clients from where specific client will pick it up
             Socket socket = (Socket)_connectedUsers;
             socket.Send(data);
           }

    }

标签: c#socketssend

解决方案


您可以通过套接字发送任何您想要的原始字节。

由接收端了解您发送的数据并适当地解释它。

您需要解决的问题是在发送方和接收方之间建立协议,以了解字符串的结束位置和视频流的开始位置。例如,您可以通过使用不属于普通消息的一部分的 UTF32 字符来终止每个字符串,或者通过发送固定长度的字符串来执行此操作。

如果我只用视频流传输一个字节数组并在服务器端接收它,我将无法指定接收它的人

我不确定你的意思。打开的套接字已经连接到另一端的特定设备。如果您的接收代码以某种方式将视频流路由/代理到另一个设备,例如,您可以使用字符串部分来指定视频流的最终接收者,并让您的接收器为最终接收者打开一个新套接字并将视频部分复制到你的流到那个新的套接字。


推荐阅读