C# TCP套接字服务器取决于ServiceBroker,如何接收整个消息并发送响应?
我正在设置一个应用程序,需要做一些事情。。。1.)从tcp套接字接收xml数据字符串。2.)将此数据插入sql表。3.)触发器更新这些表中的许多内容,并将它们放入输出表中。4.)Sql依赖项确认记录已插入到输出表中,需要通过同一套接字发送回复 我遇到的问题是,如果我从客户端获得发送到服务器的整个消息,我必须C# TCP套接字服务器取决于ServiceBroker,如何接收整个消息并发送响应?,c#,sql-server,sockets,tcp,sqldependency,C#,Sql Server,Sockets,Tcp,Sqldependency,我正在设置一个应用程序,需要做一些事情。。。1.)从tcp套接字接收xml数据字符串。2.)将此数据插入sql表。3.)触发器更新这些表中的许多内容,并将它们放入输出表中。4.)Sql依赖项确认记录已插入到输出表中,需要通过同一套接字发送回复 我遇到的问题是,如果我从客户端获得发送到服务器的整个消息,我必须。关闭客户端,这使得无法接收响应,如果我不。关闭客户端,只要消息放在一个包中,我就可以接收响应(如果服务器收到的消息太长,则会被切断,并因此引发错误)。我如何才能使此工作正常进行?因此,现在我
。关闭客户端,这使得无法接收响应,如果我不。关闭客户端,只要消息放在一个包中,我就可以接收响应(如果服务器收到的消息太长,则会被切断,并因此引发错误)。我如何才能使此工作正常进行?因此,现在我很茫然,如果需要任何其他信息来帮助此工作,请告诉我。我已接近此程序的最后期限,并且非常希望它能够正常工作
这是我的客户代码:
服务器的接收端:
我遇到的问题是,如果我从客户端接收到发送到服务器的整个消息,我必须关闭客户端,这样就无法接收响应
当然,若在向服务器发送消息时关闭套接字,客户端将不会收到响应
如果我没有。关闭客户端,只要消息放在一个数据包中,我就可以接收响应(如果消息太长,服务器接收到的消息就会被切断,从而引发错误)
TCP是流协议,不维护消息边界。您的客户端不能假定来自服务器的响应将包含在一个数据包中。它应该知道服务器的响应。对于此服务器,客户端应该有协议。例如:
响应需要多少字节?将此信息放入正在交换的消息中
包含响应消息的标记-消息开始和消息结束
基于此知识,客户应“预测”可以通过多个读取
操作得到的响应。因此,实际上,您不能只有一个读取
。您应该继续调用读取
,直到根据应用程序级别的理解读取所需的字节数。请记住,TCP对应用程序的上下文或语义一无所知离子级信息。它只是围绕位(好的,数据包)进行铲取
您需要做的是在端点之间定义某种类型的消息交换协议。这种协议必须定义固定长度的消息格式,或者使用特定的开始和结束字符来描述消息的开始和结束标记。这样做将允许您构造read()格式循环,通过长度或符号等待符合协议的消息-无论协议定义如何。需要执行大量代码,我有点慢:),但只是第一眼…至少,从服务器读取的客户端部分不应该处于某种循环中吗,检查boolean DataAvailable属性以确保读取所有数据?事实上,DataAvailable的使用可能被证明是不完整的-请看这篇文章,了解至少听起来类似的情况,以及使用sentinel字符对EOM进行积极检测:这个答案得到了否决票。我很想知道答案中的错误。如果一位投票人能告诉我原因,我会很高兴,我的也是。我想我们这里有一个“连续的投票人”。唉:)是的,大卫。我个人觉得投票支持答案应该是有道理的。不幸的是,有些人没有指出原因。好吧,我所能做的就是尽我所能继续发布好的答案,如果我发布了错误的东西,就吃我的药,如果有人想否决投票,就没有什么可以做的了。毕竟,这只是虚拟积分,你不能在任何地方花费,所以尽管它可能令人沮丧,我尽量不对此感到太沮丧:)如果mods看到有人滥发下行票,他们会处理的。祝你今天愉快:)说得好,大卫。我同意。很好的一天!
private void SendMessage(string input, TcpClient client)
{
// Ensure some xml data has been provided.
string Error = string.Empty;
if (input == string.Empty)
{
Error += "You cannot send an empty xml string\r";
Textbox_FauxXMLSend.Focus();
}
// Prompt user to correct data if needed.
if (Error != string.Empty)
{
MessageBox.Show(Error, "Send XML", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
// Send and receive the provided xml data.
using (NetworkStream networkStream = client.GetStream())
{
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(input + "\0");
networkStream.Write(outStream, 0, outStream.Length);
networkStream.Flush();
byte[] inStream = new byte[10025];
networkStream.Read(inStream, 0, (int)client.ReceiveBufferSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
Textbox_FauxXMLReceive.Text += (returndata) + "\n";
}
_requestCount++;
lblRequestCount.Text = string.Format("Request Count: {0}", _requestCount.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Send Message Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
CloseConnection(client);
}
}
private void ReceivePortMessages()
{
string debug = string.Empty;
try
{
Debug.Print(" >> Starting Server");
IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
_TcpListener = new TcpListener(ipAddress, TcpPort); ;
Debug.Print(string.Format("{0}:{1}", ipAddress.ToString(), TcpPort.ToString()));
_TcpListener.Start();
Stopwatch sw = new Stopwatch();
do
{
try
{
_TcpClient = _TcpListener.AcceptTcpClient();
Debug.Print(" >> Accept connection from client");
NetworkStream networkStream = _TcpClient.GetStream();
int receivingBufferSize = (int)_TcpClient.ReceiveBufferSize;
byte[] bytesFrom = new byte[receivingBufferSize];
int Read = 0;
string dataFromClient = string.Empty;
if (!sw.IsRunning)
{
sw.Start();
}
Read = networkStream.Read(bytesFrom, 0, receivingBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("\0"));
if (dataFromClient != string.Empty)
{
XmlDocument xm = new XmlDocument();
debug = dataFromClient;
xm.LoadXml(string.Format("<root>{0}</root>", dataFromClient));
XmlElement root = xm.DocumentElement;
string rootName = root.FirstChild.Name;
RouteInboundXML(rootName, dataFromClient, sw);
sw.Restart();
}
}
catch (Exception ex)
{
Debug.Print("ReceivePortMessages: " + ex.ToString());
_TcpClient.Close();
_TcpListener.Stop();
ErrorLog.Write("XmlProcessing", ex.ToString() + "\r\n" + "DataFromClient: " + debug, "ReceivePortMessages()");
return;
}
} while (true);
}
catch (Exception ex)
{
Debug.Print("ReceivePortMessages: " + ex.ToString());
ErrorLog.Write("XmlProcessing", ex.ToString(), "ReceivePortMessages()");
}
}
private void SendReply(string reply)
{
try
{
NetworkStream networkStream = _TcpClient.GetStream();
string serverResponse = reply;
Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
Debug.Print(" >> " + serverResponse);
}
catch (Exception ex)
{
Debug.Print(ex.ToString());
ErrorLog.Write("XmlProcessing", ex.ToString(), "SendReply()");
}
}