在C#中使用Socket进行通信时出现问题

时间:2011-04-12 14:03:15

标签: c# sockets communication

我希望我没有错过任何愚蠢的事情。我正在开发一个应用程序,它可以在多个手持窗口的移动计算机和中央服务器之间进行通信。当前架构只允许短消息(最多4096字节),我正在修改应用程序以在必要时允许更大的通信。此代码似乎间歇性地工作,具体取决于服务器的速度和网络通信速度。我需要找到一种方法使服务器接收代码更加可靠。它偶尔会完美运行,有时候手持式会抛出错误“无法将数据写入传输连接。现有连接被远程主机强制关闭”。

手持传输代码:

public bool SendMessage(NetworkStream ansStream, string asMessage)  
{  
    try  
    {  
        Byte[] wBytes = System.Text.Encoding.ASCII.GetBytes(asMessage.ToCharArray());  
        ansStream.Write(wBytes, 0, wBytes.Length);  
        return true;  
    }  
    catch (Exception E)  
    {  
        MessageBox.Show(E.Message, "Network Error");  
        return false;  
    }  
}  

服务器端接收代码:

public const int BUFFER_LENGTH = 4096;  
public void ProcessMessage(object aClient)  
{  
    TcpClient wClient = (aClient as TcpClient);  
    try  
    {  
        byte[] wBytes = new byte[BUFFER_LENGTH];  
        StringBuilder wMessage = new StringBuilder();  
        using (NetworkStream wNetStream = wClient.GetStream())  
        {  
            try  
            {  
                int wiRead = 0;  
                int wiTotalBytes = 0;  
                do  
                {  
                    wiRead = wNetStream.Read(wBytes, 0, wBytes.Length);  
                    wMessage.AppendFormat("{0}", Encoding.ASCII.GetString(wBytes, 0, wiRead));  
                    wiTotalBytes += wiRead;  

                    // my attempt to ensure entire message is read  
                    if (wNetStream.DataAvailable)  
                    {  
                        Thread.Sleep(1000);  
                    }  

                } while (wNetStream.DataAvailable);  

                if (wiTotalBytes > 0)  
                {  
                    string wsAnswerFile = "";  
                    string wsResult = DoBusinessProcess(wMessage.ToString(), out wsAnswerFile);  
                    if (string.IsNullOrEmpty(wsAnswerFile))  
                    {  
                        wBytes = Encoding.ASCII.GetBytes(wsResult);  
                        wNetStream.Write(wBytes, 0, wBytes.Length);  
                    }  
                    else  
                    {  
                        if (File.Exists(wsAnswerFile))  
                        {  
                            SendFile(wsAnswerFile, wNetStream);  
                        }  
                    }  
                }  
            }  
            catch (Exception E)  
            {  
                MessageBox.Show(E.Message, "Network Error");  
            }  
            finally  
            {  
                if (wNetStream != null)  
                {  
                    wNetStream.Close();  
                }  
            }  
        }  
    }  
}  

1 个答案:

答案 0 :(得分:0)

当您调用ProcessMessage并将其传递给TCPClient时,您是如何初始化这些TCPCLient连接的?如果你在一个没有多线程的循环中进行它,那么你可能得到的结果就像你解释过的那样。当然,如果不知道如何设置客户端监听循环,我无法确定。

点击此链接:http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server  第二个代码片段显示了一个侦听器循环,它将为每个客户端启动一个新线程。如果你没有为每个客户端启动一个新线程,如果一个新线程在你从另一个客户端接收数据时试图连接,它会说服务器无法响应。

我希望这有帮助!