- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看了几天有关 Windows Phone 7 的各种论坛,但没有一个给我明确的答案。到目前为止,我无法接收到从通过 wifi 连接的计算机发送到 Windows Phone 7 设备(在模拟器上运行)的 UDP 数据包(既不是广播也不是单播)。
显然应该支持 UDP 单播并且下面的代码运行正确,但是没有从手机接收到 UDP 数据包。我希望有人可以更正下面的代码。
注意下面的代码遵循了迄今为止在其他论坛上给出的所有建议,即:
主页.xaml
<phone:PhoneApplicationPage
x:Class="UDPClient.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="UDP Socket Application" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="Client" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,-8,12,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<!-- Fit to content -->
<ColumnDefinition Width="Auto"/>
<!-- Fit to content -->
<ColumnDefinition Width="Auto"/>
<!-- Fit to content -->
<ColumnDefinition Width="*"/>
<!-- Take up remaining space -->
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<!-- Fit to content -->
<RowDefinition Height="Auto"/>
<!-- Fit to content -->
<RowDefinition Height="Auto"/>
<!-- Fit to content -->
<RowDefinition Height="*"/>
<!-- Take up remaining space -->
</Grid.RowDefinitions>
<!-- Grid Row 0: Remote Host Input Field >-->
<TextBlock Grid.Row="0" Grid.Column="0" Text="Host Name:"
VerticalAlignment="Center" HorizontalAlignment="Center"
FontSize="{StaticResource PhoneFontSizeNormal}" />
<TextBox x:Name="txtRemoteHost" Grid.Row="0" Grid.Column="1" Height="70" Width="200"
VerticalAlignment="Top" HorizontalAlignment="Left"
FontSize="{StaticResource PhoneFontSizeNormal}" Text="192.168.1.3" />
<!-- Grid Row 1: Echo >-->
<!-- TextBlock for Echo command label-->
<TextBlock Grid.Row="1" Grid.Column="0" Text="Text To Echo:"
VerticalAlignment="Center" HorizontalAlignment="Center"
FontSize="{StaticResource PhoneFontSizeNormal}" />
<!-- TextBox for Echo command text input-->
<TextBox x:Name="txtInput" Grid.Row="1" Grid.Column="1" Height="70" Width="200"
VerticalAlignment="Top" HorizontalAlignment="Left"
FontSize="{StaticResource PhoneFontSizeNormal}" Text="test..." />
<!-- Button to the right of the input textbox for the Echo command >-->
<Button x:Name="btnEcho" Grid.Row="1" Grid.Column="2" Height="70" Width="120"
Content="Echo"
FontSize="{StaticResource PhoneFontSizeNormal}" Click="btnEcho_Click"/>
<!-- Grid Row 2: Quote of the Day-->
<!-- Button for the Quote command >-->
<Button x:Name="btnGetQuote" Grid.Row="2" Grid.ColumnSpan="4" Height="70"
Content="Get Quote of the Day"
FontSize="{StaticResource PhoneFontSizeNormal}" Click="btnGetQuote_Click"/>
<!-- Grid Row 3: Output-->
<!-- Output TextBox named 'txtOutput' >-->
<TextBox x:Name="txtOutput" Grid.Row="3" Grid.ColumnSpan="4" Background="Black" BorderBrush="Green"
AcceptsReturn="False" Foreground="LightGray" FontFamily="Courier New"
IsHitTestVisible="False" FontSize="{StaticResource PhoneFontSizeSmall}" TextWrapping="Wrap" />
<Button Content="Listen" Grid.Column="1" Grid.ColumnSpan="2" Height="70" HorizontalAlignment="Left" Margin="195,0,0,0" Name="Listenbutton" VerticalAlignment="Top" Width="125" Click="Listenbutton_Click" />
</Grid>
</Grid>
<!--Sample code showing usage of ApplicationBar-->
<!--<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/>
<shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/>
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem Text="MenuItem 1"/>
<shell:ApplicationBarMenuItem Text="MenuItem 2"/>
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>-->
</phone:PhoneApplicationPage>
MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Net.Sockets;
using System.Threading;
namespace UDPClient
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
}
// Constants
const int ECHO_PORT = 7; // The Echo protocol uses port 7 in this sample
const int QOTD_PORT = 17; // The Quote of the Day (QOTD) protocol uses port 17 in this sample
const int UDP_PORT = 4502;
/// <summary>
/// Handle the btnEcho_Click event by sending text to the echo server and outputting the response
/// </summary>
private void btnEcho_Click(object sender, RoutedEventArgs e)
{
// Clear the log
ClearLog();
// Make sure we can perform this action with valid data
if (ValidateRemoteHost() && ValidateInput())
{
// Instantiate the SocketClient
SocketClient client = new SocketClient();
SocketAsyncEventArgs socketEventArg;
// Attempt to send our message to be echoed to the echo server
Log(String.Format("Sending '{0}' to server ...", txtInput.Text), true);
string result = client.Send(txtRemoteHost.Text, ECHO_PORT, txtInput.Text, false, out socketEventArg);
Log(result, false);
// Receive a response from the echo server
Log("Requesting Receive ...", true);
result = client.UDPReceive(ECHO_PORT, false);
Log(result, false);
// Close the socket connection explicitly
client.Close();
}
}
private void Listenbutton_Click(object sender, RoutedEventArgs e)
{
// Clear the log
ClearLog();
// Make sure we can perform this action with valid data
if (ValidateRemoteHost())
{
// Instantiate the SocketClient
SocketClient client = new SocketClient();
// Receive packets
string result = client.UDPReceive(UDP_PORT, false);
Log(result, false);
// Close the socket connection explicitly
client.Close();
}
}
/// <summary>
/// Handle the btnGetQuote_Click event by receiving text from the Quote of the Day (QOTD) server and outputting the response
/// </summary>
private void btnGetQuote_Click(object sender, RoutedEventArgs e)
{
// Clear the log
ClearLog();
// Receive response from the QOTD server
Log("nothing...", true);;
}
}
#region UI Validation
/// <summary>
/// Validates the txtInput TextBox
/// </summary>
/// <returns>True if the txtInput TextBox contains valid data, False otherwise</returns>
private bool ValidateInput()
{
// txtInput must contain some text
if (String.IsNullOrWhiteSpace(txtInput.Text))
{
MessageBox.Show("Please enter some text to echo");
return false;
}
return true;
}
/// <summary>
/// Validates the txtRemoteHost TextBox
/// </summary>
/// <returns>True if the txtRemoteHost contains valid data, False otherwise</returns>
private bool ValidateRemoteHost()
{
// The txtRemoteHost must contain some text
if (String.IsNullOrWhiteSpace(txtRemoteHost.Text))
{
MessageBox.Show("Please enter a host name");
return false;
}
return true;
}
#endregion
#region Logging
/// <summary>
/// Log text to the txtOutput TextBox
/// </summary>
/// <param name="message">The message to write to the txtOutput TextBox</param>
/// <param name="isOutgoing">True if the message is an outgoing (client to server) message, False otherwise</param>
/// <remarks>We differentiate between a message from the client and server
/// by prepending each line with ">>" and "<<" respectively.</remarks>
private void Log(string message, bool isOutgoing)
{
string direction = (isOutgoing) ? ">> " : "<< ";
txtOutput.Text += Environment.NewLine + direction + message;
}
/// <summary>
/// Clears the txtOutput TextBox
/// </summary>
private void ClearLog()
{
txtOutput.Text = String.Empty;
}
#endregion
}
}
套接字客户端
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Net.Sockets;
using System.Threading;
using System.Text;
namespace UDPClient
{
public class SocketClient
{
// Cached Socket object that will be used by each call for the lifetime of this class
Socket _socket = null;
// Signaling object used to notify when an asynchronous operation is completed
static ManualResetEvent _clientDone = new ManualResetEvent(false);
// Define a timeout in milliseconds for each asynchronous call. If a response is not received within this
// timeout period, the call is aborted.
const int TIMEOUT_MILLISECONDS = 1000;
// The maximum size of the data buffer to use with the asynchronous socket methods
const int MAX_BUFFER_SIZE = 2048;
bool isHasSent = false;
int errorCode = 0;
/// <summary>
/// SocketClient Constructor
/// </summary>
public SocketClient()
{
// The following creates a socket with the following properties:
// AddressFamily.InterNetwork - the socket will use the IP version 4 addressing scheme to resolve an address
// SocketType.Dgram - a socket that supports datagram (message) packets
// PrototcolType.Udp - the User Datagram Protocol (UDP)
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
}
/// <summary>
/// Send the given data to the server using the established connection
/// </summary>
/// <param name="serverName">The name of the server</param>
/// <param name="portNumber">The number of the port over which to send the data</param>
/// <param name="data">The data to send to the server</param>
/// <returns>The result of the Send request</returns>
public string Send(string serverName, int portNumber, string data, bool isBroadcast, out SocketAsyncEventArgs socketEventArg)
{
string response = "Operation Timeout";
// Create SocketAsyncEventArgs context object
// We are re-using the _socket object that was initialized in the Connect method
if (_socket != null)
{
socketEventArg = new SocketAsyncEventArgs();
// Set properties on context object
System.Diagnostics.Debug.WriteLine("Send(): setting remoteEndPoint");
if (isBroadcast)
socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Broadcast, portNumber);
else
socketEventArg.RemoteEndPoint = new DnsEndPoint(serverName, portNumber);
System.Diagnostics.Debug.WriteLine("Send(): remoteEndPoint correctly set");
// Inline event handler for the Completed event.
// Note: This event handler was implemented inline in order to make this method self-contained.
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
response = e.SocketError.ToString();
// Unblock the UI thread
_clientDone.Set();
isHasSent = true;
});
// Add the data to be sent into the buffer
byte[] payload = Encoding.UTF8.GetBytes(data);
socketEventArg.SetBuffer(payload, 0, payload.Length);
// Sets the state of the event to nonsignaled, causing threads to block
_clientDone.Reset();
// Make an asynchronous Send request over the socket
_socket.SendToAsync(socketEventArg);
// Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
// If no response comes back within this time then proceed
_clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
socketEventArg = null;
response = "Socket is not initialized";
}
return response;
}
public String UDPReceive(int portNumber, bool isBroadcast)
{
SocketAsyncEventArgs socketEventArg;
System.Diagnostics.Debug.WriteLine("calling Send(\"server\", portNumber, \" \", isBroadcast, out socketEventArg)");
Send("servern", portNumber, " ", !isBroadcast, out socketEventArg);
Thread.Sleep(1000);
while (!isHasSent)
{
Thread.Sleep(1);
}
System.Diagnostics.Debug.WriteLine("calling Receive(portNumber, isBroadcast, socketEventArg)");
return Receive(portNumber, isBroadcast, out socketEventArg);
}
/// <summary>
/// Receive data from the server
/// </summary>
/// <param name="portNumber">The port on which to receive data</param>
/// <returns>The data received from the server</returns>
public string Receive(int portNumber, bool isBroadcast, out SocketAsyncEventArgs socketEventArg)
{
string response = "Operation Timeout";
// We are receiving over an established socket connection
if (_socket != null)
{
// Create SocketAsyncEventArgs context object
socketEventArg = new SocketAsyncEventArgs();
System.Diagnostics.Debug.WriteLine("Receive(): setting remoteEndPoint");
if (isBroadcast)
socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Broadcast, portNumber);
else
socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, portNumber);
System.Diagnostics.Debug.WriteLine("Receive(): remoteEndPoint correctly set");
// Setup the buffer to receive the data
socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
System.Diagnostics.Debug.WriteLine("Receive(): SetBuffer() correctly called");
// Inline event handler for the Completed event.
// Note: This even handler was implemented inline in order to make this method self-contained.
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
System.Diagnostics.Debug.WriteLine("Receive(): SocketError.Success");
// Retrieve the data from the buffer
response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
response = response.Trim('\0');
}
else
{
System.Diagnostics.Debug.WriteLine("Receive(): SocketError.Error");
response = e.SocketError.ToString();
}
System.Diagnostics.Debug.WriteLine("Receive(): Set()");
_clientDone.Set();
});
System.Diagnostics.Debug.WriteLine("Receive(): Reset()");
// Sets the state of the event to nonsignaled, causing threads to block
_clientDone.Reset();
try
{
// Make an asynchronous Receive request over the socket
_socket.ReceiveFromAsync(socketEventArg);
}
catch (SocketException sockEx)
{
Console.WriteLine(sockEx.Message);
Console.WriteLine(sockEx.ErrorCode);
Console.WriteLine(sockEx.StackTrace);
Console.ReadLine();
System.Diagnostics.Debug.WriteLine("errorCode=" + errorCode + " " + sockEx.Message + sockEx.ErrorCode + sockEx.StackTrace);
errorCode = 11;
response += "errorCode=" + errorCode + " " + sockEx.Message + sockEx.ErrorCode + sockEx.StackTrace;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
Console.ReadLine();
System.Diagnostics.Debug.WriteLine("errorCode="+errorCode+" "+ex.Message + ex.StackTrace);
errorCode = 22;
response += "errorCode="+errorCode+" "+ex.Message + ex.StackTrace;
}
// Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
// If no response comes back within this time then proceed
System.Diagnostics.Debug.WriteLine("Receive(): _clientDone.WaitOne(TIMEOUT_MILLISECONDS)");
_clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
socketEventArg = null;
response = "Socket is not initialized";
}
System.Diagnostics.Debug.WriteLine("Receive(): response = " + response);
return response;
}
/// <summary>
/// Closes the Socket connection and releases all associated resources
/// </summary>
public void Close()
{
if (_socket != null)
{
_socket.Close();
}
}
}
}
最佳答案
Windows Phone 的 Silverlight 不需要端口 4502,但浏览器的 Silverlight 应用程序只需要端口 4502。我正在检查您的代码,因为我遇到了同样的问题。
关于sockets - Windows Phone 7 通过 wifi 接收 UDP 数据包(广播或单播),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11539922/
谁能给我提供代码或链接,以便在可能的情况下使用 UDP 发送和接收广播消息? 我一直被困在一个问题中,希望你们能帮助我解决它。谢谢 最佳答案 这是一个 C# 示例: using System; usi
我想将形状为 [a,b,c] 的张量中的元素相乘,每个元素在第 3 维中使用来自形状为 [a,b] 的张量的标量。 例如, x = |[1,2][3,4][5,6]| |[1,2][3,4][5,6]
广播是使具有不同形状的数组具有用于算术运算的兼容形状的过程。在 numpy 中,我们可以广播数组。 TensorFlow 图是否支持类似于 numpy 的广播? 最佳答案 是的,它是支持的。打开终端并
我有一个刷新功能,需要广播到子 Controller 。我在父 Controller 中做了类似的事情: // Refresh/Cancel $scope.OnGridBODRefre
我正在尝试在计算中使用字典值,如下所示: mydict = dict(zip(['key1', 'key2', 'key3'], [1, 2, 3])) print
刚刚掌握使用 MPI 的 Java 接口(interface)进行并行编程。只是想知道是否有人可以非常简单地解释广播的工作原理? 我有以下内容: if (me ==0) { // This is th
我正在处理一个项目,当我发送消息时,我将它作为通知发送给另一个用户使用广播它工作正常但是当我再次发送新消息然后替换为旧通知而不创建新通知 下面是我生成通知的代码 NotificationCompat.
我是 android 的初学者。但我非常需要你的帮助。我有一个流媒体视频广播视频项目。我找不到好的示例,在哪里可以实现从摄像机录制视频、将流发送(上传)到服务器以及从服务器下载(获取流)到播放器。请帮
请帮我解决我的问题。当我从父 Controller 调用并在子 Controller 中捕获时,为什么 $broadcast 函数不起作用?
我如何从 shell 中看到设置了哪些套接字选项?我特别想知道是否设置了 SO_BROADCAST? 最佳答案 你看过lsof了吗? 关于linux - 广播 socket ,我们在Stack Ove
当我在 Numpy 中进行此操作时会发生什么? a = np.ones([500,1]) b = np.ones([5000,])/2 c = a + b # a.shape (500,1) # b.
我有一个 Nexus S,当我在手机上手动更改日期时,并不总是广播 ACTION_DATE_CHANGED。如果我将日期从 2014 年 2 月 13 日更改为 2014 年 2 月 14 日,我还没
环境:springboot2.3.9RELEASE + RocketMQ4.8.0 依赖 <dependency>  
UDP 广播 面向连接的传输(如 TCP)管理两个网络端点之间的连接的建立,在连接的生命周期的有序和可靠的消息传输,以及最后,连接的有序终止。相比之下,类似 UDP 的无连接协议中则没有持久化连接的概
我正在开发一个带有 Angular 的单页应用程序,我需要在两个不同的指令之间进行通信,这些指令基本上没有父子关系。 在指令 A 中,我有 2 个地方需要从不同的功能广播相同的事件。在指令 B 中,为
我有一个带有多个重复项的主要二维 numpy 数组和一个具有第一个唯一值的辅助数组。 [[ 0 0 1 ] [ 1 0 2 ] [ 2 0 2 ] ... [ 0 0 1 ]
我正在制作多人网络游戏。现在要连接到服务器,客户端需要服务器的 ip 地址。 所以,我的实现方式如下。 客户端在广播 IP 和端口 A 上广播其 IP 地址。服务器通过 A 监听它,并且 服务器与客户
是否可以在没有 Urban Airship 等服务的情况下广播推送通知? 谢谢。 最佳答案 当然可以,但是您需要自己实现整个基础架构。 http://developer.apple.com/libra
我想复制矩阵的每一行 M没有任何复制发生(即通过创建 View ): 0 1 0 1 2 3 -> 0 1 2 3
我从一个 2D 数组开始,想将它广播到一个 3D 数组(例如,从灰度图像到 rgb 图像)。这是我使用的代码。 >>> img_grey = np.random.randn(4, 4) >>> img
我是一名优秀的程序员,十分优秀!