Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TCP套接字服务器取决于ServiceBroker,如何接收整个消息并发送响应?_C#_Sql Server_Sockets_Tcp_Sqldependency - Fatal编程技术网

C# TCP套接字服务器取决于ServiceBroker,如何接收整个消息并发送响应?

C# TCP套接字服务器取决于ServiceBroker,如何接收整个消息并发送响应?,c#,sql-server,sockets,tcp,sqldependency,C#,Sql Server,Sockets,Tcp,Sqldependency,我正在设置一个应用程序,需要做一些事情。。。1.)从tcp套接字接收xml数据字符串。2.)将此数据插入sql表。3.)触发器更新这些表中的许多内容,并将它们放入输出表中。4.)Sql依赖项确认记录已插入到输出表中,需要通过同一套接字发送回复 我遇到的问题是,如果我从客户端获得发送到服务器的整个消息,我必须。关闭客户端,这使得无法接收响应,如果我不。关闭客户端,只要消息放在一个包中,我就可以接收响应(如果服务器收到的消息太长,则会被切断,并因此引发错误)。我如何才能使此工作正常进行?因此,现在我

我正在设置一个应用程序,需要做一些事情。。。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()");
    }
}