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