C#通过Socket同时发送字符串和视频流
Posted
技术标签:
【中文标题】C#通过Socket同时发送字符串和视频流【英文标题】:C# Send string and video stream at the same time over Socket 【发布时间】:2020-11-12 11:31:34 【问题描述】:我在 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);
显然,如果我只用视频流传输一个字节数组并在服务器端接收它,我将无法指定接收它的人。但是如果使用字符串它有第二个字节数组,我可以导航到将接收它的用户。
已更新 我已经在发送者和接收者之间建立了协议 当服务器接收到一个字符串字节数组时,它将读取第一个单词,如果它包含例如“Connect”,则服务器将其传递给所有客户端:
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);
【问题讨论】:
一个打开的套接字已经绑定到一个特定的用户。为什么您需要在您的信息流中专门声明该用户信息?您的服务器是否充当两个用户之间的中介? 直觉上,我觉得你需要为此使用协议缓冲区之类的东西。 当我使用 Send(String) 时,它会进入服务器并从服务器广播到所有连接的套接字。当我使用字符串时,我可以在服务器的字符串中指定用户名,并且客户端只有在它包含他的用户名时才会接受字符串。但不是当我发送视频阵列时。它只是一个字节,没有指定用户名的字符串。有意义吗? 好吧,当然,但是如果服务器上的软件只接受字符串而不接受视频流... @EricJ。视频流必须被打包,然后在接收端缓冲以供播放。所以可能有一些缺失的部分。 【参考方案1】:您可以通过套接字发送任何您想要的原始字节。
由接收端了解您发送的数据并对其进行适当解释。
您需要解决的问题是在发送方和接收方之间建立协议,以了解字符串的结束位置和视频流的开始位置。例如,您可以通过使用不属于普通消息一部分的 UTF32 字符来终止每个字符串,或者发送一个固定长度的字符串。
如果我只用视频流传输一个字节数组并在服务器端接收它,我将无法指定接收它的人
我不确定你的意思。打开的套接字已经连接到另一端的特定设备。如果您的接收代码以某种方式将视频流路由/代理到另一个设备,例如,您可以使用字符串部分来指定视频流的最终接收者,并让您的接收器为最终接收者打开一个新套接字并复制视频部分你的流到那个新的套接字。
【讨论】:
我已经编辑了我的帖子。在更新部分中,您可以看到我在服务器中所做的事情。这就是我导航到哪里发送字符串的方式。问题是我不能用 String 和另一个 Byte[] 将视频导航到接收字符串的同一用户。以上是关于C#通过Socket同时发送字符串和视频流的主要内容,如果未能解决你的问题,请参考以下文章