【发布时间】: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。视频流必须被打包,然后在接收端缓冲以供播放。所以可能有一些缺失的部分。