我已经工作了数周,创建了一个客户端/服务器来控制位于服务器端的音乐服务器应用程序,该应用程序由位于LAN上的多个客户端应用程序控制.我成功地让客户端与服务器通信,发送操作音乐服务器的命令,并通过使用回调,回复客户端,以便可以适当地更新所有客户端UI.但问题是,我无法弄清楚如何广播需要从服务器应用程序发送到客户端的其他消息.我希望利用回调方法; 但是我无法从服务器端访问它.我是否需要修改或创建另一个提供从服务器到客户端的通信的合同?绑定是否需要修改?正如我之前提到的,我已经真正开展了数周的工作(开始感觉像'年'),并希望能够使这个应用程序的最后一部分工作.有人会引导我朝正确的方向前进吗?
客户端服务参考:
<?xml version="1.0" encoding="utf-8"?>
<ServiceReference>
<ProxyGenerationParameters
ServiceReferenceUri="http://localhost:8001/APService/mex"
Name="APGateway"
NotifyPropertyChange="True"
UseObservableCollection="False">
</ProxyGenerationParameters>
<EndPoints>
<EndPoint
Address="net.tcp://localhost:8000/APService/service"
BindingConfiguration="TcpBinding"
Contract="APClient.APGateway.APUserService"
>
</EndPoint>
<EndPoint
Address="http://localhost:8001/APService/service"
BindingConfiguration="HttpBinding"
Contract="APClient.APGateway.APUserService"
>
</EndPoint>
</EndPoints>
</ServiceReference>
Run Code Online (Sandbox Code Playgroud)
客户端AP CONFIG
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="APClient.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<system.serviceModel>
<client>
<endpoint
address="net.tcp://localhost:8000/APService/service"
binding="netTcpBinding"
contract="APClient.APGateway.APUserService"
name="TcpBinding" />
<endpoint
address="http://localhost:8001/APService/service"
binding="wsDualHttpBinding"
contract="APClient.APGateway.APUserService"
name="HttpBinding" />
</client>
</system.serviceModel>
<applicationSettings>
<APClient.Properties.Settings>
<setting name="pathToDatabase" serializeAs="String">
<value>C:\Users\Bill\Documents\APData\</value>
</setting>
</APClient.Properties.Settings>
</applicationSettings> …
Run Code Online (Sandbox Code Playgroud) 我正在尝试利用MSDN的异步客户端套接字代码示例来连接和控制一些家用设备.据我所知,示例代码的ReceiveCallback方法使用EventWaitHandle ManualResetEvent的实例和方法receiveDone.WaitOne()来保存当前线程的处理,直到线程收到一个信号表明所有套接字的数据都已从远程设备传输.在传输完所有套接字数据后(套接字的数据为空且bytesRead = 0),删除了Waithandle并继续处理应用程序.
不幸的是,通过逐步执行代码,似乎在客户端最后一次从远程设备返回数据之后,ReceiveCallback永远不会返回以查看数据队列是否为空(即bytesRead = 0),因此永远不会在ReceiveCallback中输入"else"条件,其中ManualResetEvent的状态将被重置并且应用程序将继续处理.因此,由于它永远不会进入"else"状态,因此永远不会重置ManualResetEvent并且应用程序会冻结.
虽然我可以从代码中删除"receiveDone.WaitOne()"方法 - 允许执行而不等待ManualResetEvent通知已收到所有数据; 这将返回设备中通常不完整的数据字符串.
我是否错误地使用此代码示例?有没有人见过这个或者有过如何解决这个问题的经验?
7/14/2012 - 更新:在进一步测试MSDN的异步客户端套接字示例后,很明显ReceiveCallback实际上重新轮询端口,并且只有在套接字被释放时才满足"bytesRead = 0"条件(即客户端. Shutdown(SocketShutdown.Both); client.Close();).如果我理解正确,这意味着必须关闭连接以通过receiveDone.WaitOne()方法.如果关闭连接以满足WaitOne()Waithandle,它完全违背了应用程序的目的,因为我一直希望保持连接打开,以便应用程序可以监听设备更新,这种情况不断发生.
2012年7月16日 - 更新:我写信给微软技术支持部门,他们回复说"我们正在研究这个问题.我们可能需要一些时间才能回复你." 因此,似乎此时通过按摩此代码似乎无法解决此挑战.
如果没有Asynchronous Client Socket示例代码作为编写异步通信程序的基础,请问是否有人可以建议更可靠的替换例程? 有三个设备,每个设备都有自己的IP地址和端口号.因此,如果可以使用类,可以为每个设备创建实例,这将是理想的.此外,端口必须保持打开状态,以接收设备不断发送的自发更新.最后,更新没有结束字符或定义长度信令消息的传输完成,因此例程必须不断地轮询端口以获取可用数据. 任何建议或意见将不胜感激.
2012年7月18日 - 解决方法:在花费大量时间尝试使MSDN的异步客户端套接字代码示例正常工作之后,很明显我必须在其他地方查找以获得程序持续识别的设备响应.为了拯救别人的脑损伤,我已经包含了我使用的解决方案,这似乎在这一点上运作良好.如果有人有任何建议,请不要犹豫,加入这个问题!
//
// ORIGINAL CODE ATTEMPT
//
public static Socket LutronClient; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试与XM调谐器进行串行通信.调谐器要求从comport发送一系列字节以控制调谐器,命令流的一个例子如下:"B8,4D,18,30,20,B8".最初,我试图将命令作为字符串(下面)发送,但这不起作用.
_Comport.Write("B8,4D,18,30,20,B8");
Run Code Online (Sandbox Code Playgroud)
我还尝试将命令转换为字节数组,但这也无效.
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
Byte[] bytes = encoding.GetBytes("B8,4D,18,30,20,B8");
_Comport.Write(bytes,0,bytes.Length);
Run Code Online (Sandbox Code Playgroud)
该打开并接收来自调谐器的消息; 但是我不知道如何将字节流传输到调谐器.有人可以引导我如何与调谐器进行适当的沟通吗?
有没有人可能认为以下值为"40195.315752"作为日期?我需要将这个基于值的日期转换/格式化为System.DateTime对象,但不理解它的格式.
谢谢.
c# ×2
asynchronous ×1
client ×1
date ×1
date-format ×1
datetime ×1
serial-port ×1
sockets ×1
wcf ×1