C#套接字侦听器(服务器)

时间:2017-03-01 12:58:55

标签: c# .net sockets stream listener

我有以下程序以XML的形式接收套接字流并将它们插入到SQL数据库中。我的问题如下:   - 在调试模式下启动程序时,所有xml流都会成功插入数据库。   - 当它正常启动时(没有调试模式),程序将插入一个xml流而错过另一个(因此,如果我有20个流,则只插入10个流)。

此代码中的错误是什么?

client = Listener.AcceptTcpClient();
                    netstream = client.GetStream();
                    Status = "Connected to a client\n";   
                    byte[] bytes = new byte[client.ReceiveBufferSize + 1];
                        netstream.Read(bytes, 0, Convert.ToInt32(client.ReceiveBufferSize));
                        // Return the data received from the client 
                        string clientdata = System.Text.Encoding.ASCII.GetString(bytes);
                        Status="Client sent: " + clientdata ;
                        StorePolicy(clientdata);
                        Query = clientdata;
                        Query = Query.Replace("\0", "");
                        StorePolicy(Query);

                        Status="Received Query: " + Query;
                        StorePolicy("Received Query: " + Query);
                        netstream.Close();
                        client.Close();  
                        ///////////////insert into database/////////    
                       try
                         {                               
                           SqlConnection conn = new SqlConnection(connectionString);
                           SqlCommand Cmd = new SqlCommand();     
                           string[] words = Query.Split(new[] { "</RECORD>" }, StringSplitOptions.None);    
                           StorePolicy(Query);
                           foreach (string word in words)
                           {
                               if (!string.IsNullOrEmpty(word))
                               {

                                    record = word.Replace("'", "''") + "</RECORD>";
                                    StorePolicy(record);
                                   StrQuery = "INSERT INTO SMSListenner(XMLText) VALUES ('" + record.Replace("'", "''") + "')";
                                   Cmd = new SqlCommand(StrQuery, conn);
                                   conn.Open();
                                   Cmd.ExecuteReader();
                                   conn.Close();    
                                   StorePolicy(StrQuery);

                               }
                           }    
                         }

1 个答案:

答案 0 :(得分:1)

MSDN明确表示:

  

TcpListener类提供了侦听和的简单方法   接受阻塞同步模式下的传入连接请求

这意味着一旦连接了一个客户端,它就会阻止所有其他客户端,直到您的“穷人Web服务器”完成流。在队列中等待的其他客户端可能会在平均时间内超时。请注意自己在处理请求时遇到了很多问题。这意味着您将在相当长的时间内阻止其他客户端。

此外,您没有异常处理,因此一个客户端可以终止您的整个“服务器”。

我的建议是,如果不是学生学习套接字如何工作的项目,请使用适当的Web服务器,并在连接之间进行隔离,并且能够同时处理多个连接。