我希望我没有错过任何愚蠢的事情。我正在开发一个应用程序,它可以在多个手持窗口的移动计算机和中央服务器之间进行通信。当前架构只允许短消息(最多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();
}
}
}
}
}
答案 0 :(得分:0)
当您调用ProcessMessage并将其传递给TCPClient时,您是如何初始化这些TCPCLient连接的?如果你在一个没有多线程的循环中进行它,那么你可能得到的结果就像你解释过的那样。当然,如果不知道如何设置客户端监听循环,我无法确定。
点击此链接:http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server 第二个代码片段显示了一个侦听器循环,它将为每个客户端启动一个新线程。如果你没有为每个客户端启动一个新线程,如果一个新线程在你从另一个客户端接收数据时试图连接,它会说服务器无法响应。
我希望这有帮助!