我需要通过TCP连接发送500条消息,并在限定时间内收到每条消息的响应,使用线程保持在时间内。这对我来说是新的,在我把它放到这里之前我花了很多时间搜索论坛,所以请耐心等待。
到目前为止,我得到的最好结果是有一些变化:
List<Task> tasks = new List<Task>();
for(int i=1;i<500;i++)
{
Task task = new Task(new SendMessage(Message(i)).Send);
tasks.Add(task);
}
然后
foreach(Task task in tasks)
{
task.Start();
}
// Keep track of time (stay within 30s)
Stopwatch s = new Stopwatch();
s.Start();
while (s.ElapsedMilliseconds < 30000)
{
Console.WriteLine((int)(0.001 * s.ElapsedMilliseconds));
Thread.Sleep(2000);
}
然后
public class SendMessage
{
byte[] msg;
ASCIIEncoding asen = new ASCIIEncoding();
NetworkStream stm;
public void Send()
{
try
{
TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect("IPADDRESS", port);
stm = tcpclnt.GetStream();
stm.Write(msg, 0, msg.Length);
using (XmlReader xmlReader = XmlReader.Create(stm))
{
while (xmlReader.Read())
{
string requestID = String.Empty;
string message = String.Empty;
if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "requestID"))
{
requestID = xmlReader.ReadInnerXml();
sw.Write("requestID\t" + requestID + "\t");
Console.WriteLine("requestID\t" + requestID + "\t");
}
else if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "message"))
{
message = xmlReader.ReadInnerXml();
sw.WriteLine("message\t" + message);
Console.WriteLine("message\t" + message);
xmlReader.Close();
}
}
}
}
catch
{
Send();
}
}
public SendMessage( string msg)
{
this.msg = asen.GetBytes(msg);
}
}
但是应用程序在阅读部分不断崩溃。我在这个例子中得到的错误是
XMLException - 缺少根元素
try / catch块似乎有效,但错误是如此频繁,以至于它使应用程序减慢到我无法保持时间消耗可接受的程度。
我尝试过的变种
答案 0 :(得分:2)
在TCP连接中,您可以同时向套接字发送和接收,但不能从多个线程发送或接收。
使用生产者/消费者模式的最佳方式,因此您可以无需等待即可发送消息并在消息到达时收到通知:How to: Implement a Producer-Consumer Dataflow Pattern
此外,您需要一些框架协议来通过套接字发送内容,让另一端知道消息的开始或结束位置。这就是缺少部分文件的原因。
我建议你看看WCF:Windows Communication Foundation [.NET Framework 4.0]
答案 1 :(得分:2)
我相信你遇到的问题是你在从流中读取之前没有等待响应。 The accepted answer here shows how to wait for a response before reading.虽然还有其他复杂因素需要考虑,但这应该可以解决您当前的问题。如果您的消息很大(超过~1.5 KB,或者您的默认mtu大小),仅仅因为您在套接字上收到了一些数据,并不意味着您已经在套接字上收到了所有数据。因此,您需要某种框架来处理XML响应。这导致了另一个答案,您是否考虑过调查WCF或Web服务生产者/消费者?