[英]How to broadcast a message using StreamSocket
我按照一個教程創建通過Stream Socket連接的WindowsPhone設備。
向彼此發送消息非常有效。 但是我不知道該如何廣播消息。 有人可以告訴我如何嗎?
private StreamSocket _socket = new StreamSocket();
private StreamSocketListener _listener = new StreamSocketListener();
private List<StreamSocket> _connections = new List<StreamSocket>();
private bool _connecting = false;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
//myConnectionTargetText.Text = "192.168.1.3";
myConnectionTargetText.Text = "localhost"; // a TextBox
}
async private void WaitForData(StreamSocket socket)
{
var dr = new DataReader(socket.InputStream);
//dr.InputStreamOptions = InputStreamOptions.Partial;
var stringHeader = await dr.LoadAsync(4);
if (stringHeader == 0)
{
LogMessage(string.Format("Disconnected (from {0})", socket.Information.RemoteHostName.DisplayName));
return;
}
int strLength = dr.ReadInt32();
uint numStrBytes = await dr.LoadAsync((uint)strLength);
string msg = dr.ReadString(numStrBytes);
LogMessage(string.Format("Received (from {0}): {1}", socket.Information.RemoteHostName.DisplayName, msg));
WaitForData(socket);
}
async private void Connect(object sender, RoutedEventArgs e)
{
try
{
_connecting = true;
await _socket.ConnectAsync(new HostName(myConnectionTargetText.Text), "3011");
_connecting = false;
LogMessage(string.Format("Connected to {0}", _socket.Information.RemoteHostName.DisplayName));
WaitForData(_socket);
}
catch (Exception ex)
{
_connecting = false;
}
}
async private void Listen(object sender, RoutedEventArgs e)
{
_listener.ConnectionReceived += listenerConnectionReceived;
await _listener.BindServiceNameAsync("3011");
LogMessage(string.Format("listening on {0}...", _listener.Information.LocalPort));
}
void listenerConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
_connections.Add(args.Socket);
LogMessage(string.Format("Incoming connection from {0}", args.Socket.Information.RemoteHostName.DisplayName));
WaitForData(args.Socket);
}
private void LogMessage(string message)
{
Dispatcher.BeginInvoke(() =>
{
myText.Text += message + Environment.NewLine;
});
}
async private void SendMessage(StreamSocket socket, string message)
{
var writer = new DataWriter(socket.OutputStream);
var len = writer.MeasureString(message); // Gets the UTF-8 string length.
writer.WriteInt32((int)len);
writer.WriteString(message);
var ret = await writer.StoreAsync();
writer.DetachStream();
LogMessage(string.Format("Sent (to {0}) {1}", socket.Information.RemoteHostName.DisplayName, message)); // richTextBox
}
無法通過流套接字進行多播,因為流套接字是端點到端點的連接。
您有兩種選擇:
DatagramSocket
)並使用多播。 請注意,切換到UDP會帶來一系列問題:您將失去可靠性(數據包可能會丟失),排序(數據包可能會亂序到達)以及最大數據報大小(您必須自己拆分消息) 。 因此,大多數應用程序使用中央服務器來偽造多播。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.