- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个更新服务器,它通过 TCP 端口 12000 发送客户端更新。单个文件的发送仅在第一次成功,但之后我在服务器上收到错误消息“无法将数据写入传输连接: 现有连接被远程主机强行关闭”。如果我在服务器上重新启动更新服务,它只会再次运行一次。我有正常的多线程 Windows 服务。
namespace WSTSAU
{
public partial class ApplicationUpdater : ServiceBase
{
private Logger logger = LogManager.GetCurrentClassLogger();
private int _listeningPort;
private int _ApplicationReceivingPort;
private string _setupFilename;
private string _startupPath;
public ApplicationUpdater()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
init();
logger.Info("after init");
Thread ListnerThread = new Thread(new ThreadStart(StartListener));
ListnerThread.IsBackground = true;
ListnerThread.Start();
logger.Info("after thread start");
}
private void init()
{
_listeningPort = Convert.ToInt16(ConfigurationSettings.AppSettings["ListeningPort"]);
_setupFilename = ConfigurationSettings.AppSettings["SetupFilename"];
_startupPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6);
}
private void StartListener()
{
try
{
logger.Info("Listening Started");
ThreadPool.SetMinThreads(50, 50);
TcpListener listener = new TcpListener(_listeningPort);
listener.Start();
while (true)
{
TcpClient c = listener.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(ProcessReceivedMessage, c);
}
}
catch (Exception ex)
{
logger.Error(ex.Message);
}
}
void ProcessReceivedMessage(object c)
{
try
{
TcpClient tcpClient = c as TcpClient;
NetworkStream Networkstream = tcpClient.GetStream();
byte[] _data = new byte[1024];
int _bytesRead = 0;
_bytesRead = Networkstream.Read(_data, 0, _data.Length);
MessageContainer messageContainer = new MessageContainer();
messageContainer = SerializationManager.XmlFormatterByteArrayToObject(_data, messageContainer) as MessageContainer;
switch (messageContainer.messageType)
{
case MessageType.ApplicationUpdateMessage:
ApplicationUpdateMessage appUpdateMessage = new ApplicationUpdateMessage();
appUpdateMessage = SerializationManager.XmlFormatterByteArrayToObject(messageContainer.messageContnet, appUpdateMessage) as ApplicationUpdateMessage;
Func<ApplicationUpdateMessage, bool> HandleUpdateRequestMethod = HandleUpdateRequest;
IAsyncResult cookie = HandleUpdateRequestMethod.BeginInvoke(appUpdateMessage, null, null);
bool WorkerThread = HandleUpdateRequestMethod.EndInvoke(cookie);
break;
}
}
catch (Exception ex)
{
logger.Error(ex.Message);
}
}
private bool HandleUpdateRequest(ApplicationUpdateMessage appUpdateMessage)
{
try
{
TcpClient tcpClient = new TcpClient();
NetworkStream networkStream;
FileStream fileStream = null;
tcpClient.Connect(appUpdateMessage.receiverIpAddress, appUpdateMessage.receiverPortNumber);
networkStream = tcpClient.GetStream();
fileStream = new FileStream(_startupPath + "\\" + _setupFilename, FileMode.Open, FileAccess.Read);
FileInfo fi = new FileInfo(_startupPath + "\\" + _setupFilename);
BinaryReader binFile = new BinaryReader(fileStream);
FileUpdateMessage fileUpdateMessage = new FileUpdateMessage();
fileUpdateMessage.fileName = fi.Name;
fileUpdateMessage.fileSize = fi.Length;
MessageContainer messageContainer = new MessageContainer();
messageContainer.messageType = MessageType.FileProperties;
messageContainer.messageContnet = SerializationManager.XmlFormatterObjectToByteArray(fileUpdateMessage);
byte[] messageByte = SerializationManager.XmlFormatterObjectToByteArray(messageContainer);
networkStream.Write(messageByte, 0, messageByte.Length);
int bytesSize = 0;
byte[] downBuffer = new byte[2048];
while ((bytesSize = fileStream.Read(downBuffer, 0, downBuffer.Length)) > 0)
{
networkStream.Write(downBuffer, 0, bytesSize);
}
fileStream.Close();
tcpClient.Close();
networkStream.Close();
return true;
}
catch (Exception ex)
{
logger.Info(ex.Message);
return false;
}
finally
{
}
}
protected override void OnStop()
{
}
}
我必须注意我的 Windows 服务(服务器)是多线程的。
最佳答案
在接收端,设置一个 while 循环来监听直到没有更多数据,然后优雅地退出:关闭流和客户端。框架 TCP 库认为在线程退出时放弃冷连接是一个问题,因此会抛出您所看到的异常。
这还将使您免于在更正当前问题后可能会遇到的间歇性问题:使用长度说明符的 Stream.Read 不会每次都为您提供完整的缓冲区。看起来您正在发送(最多)2kb block 并接收到(单发)1kb 缓冲区,所以您也可能开始遇到 XML 异常。
如果这还不够详细,请询问,我会挖掘一些旧的 TcpClient 代码。
关于c# - 无法将数据写入传输连接 : An existing connection was forcibly closed by the remote host,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3645861/
我正在开发我的应用程序之一的新版本,Time Out,它使用登录项帮助程序进行安排。我的几个 alpha 测试人员报告内存泄漏和 CPU 使用率过高...但我也无法重现。 特别是,他们提到了性能低下以
我已经创建了一个多线程 TCP 服务器。当客户端断开连接时,我收到 “现有连接被远程主机强行关闭”错误。 除了捕获错误之外,处理远程客户端断开连接的最佳方法是什么? 最佳答案 假设您的服务器正在处理连
我已经在 Windows 中安装了 android-studio。但每次重建/运行/项目时都会出现此错误。 An existing connection was forcibly closed by
我正在Windows中使用最新版本的docker。 linux容器运行顺利,但是我遇到了以下问题 wsarecv: An existing connection was forcibly closed
我使用 Visual Studio 2010 和 MS SQL Server 2005。我是 WCF 的新手,我正在尝试在开发小型任务管理应用程序时学习。 目前我有一个解决方案,里面有两个控制台应用程
我在我的 Debian Wheezy 构建服务器上创建了一个 SVN 存储库,遵循 this tutorial。 .svn --version给 1.6.17 . 可悲的是,我不能再从我的 Windo
我该怎么办?关闭 socket ?我看不到问题,谷歌没有帮助 什么会导致此错误?据我了解,这是系统类型异常。 Console.WriteLine("Connection Recieved");
我在向列插入大值时遇到问题,值byte[] 长度为 25130744(从 DataSet 转换为 byte[]),并给我一个异常:IOException:无法从传输连接读取数据:现有连接被远程主机强制
当我尝试从 morizon.pl 下载源代码页面时遇到问题: WebClient webClient = new WebClient(); try { string str
我有一个自托管的WCF服务,还有几个客户端进程...一切正常,客户端启动,进行多个服务调用,然后退出。但是,在服务器上,每次客户端应用程序关闭时,我的错误日志(我从System.ServiceMode
在使用 boost asio 时,我偶然发现了一些我不太理解的奇怪行为。我写了一个最小的测试程序来重现这个问题: #include #include using boost::asio::ip::
我正在尝试连接我的 HTC Wildfire,我已激活(USB 调试)并将其连接到电脑,但 Eclipse 无法识别它 那个错误:Adb 连接错误:现有连接被远程主机强行关闭 我重置了 adb 但出现
我想为我的公司项目创建一个团队基础构建,我在服务器上安装了构建 Controller 和构建代理,然后在 visual studio 中创建了构建定义,但是当我想运行这个构建(队列)时,我得到了这个错
有什么可以帮我解决这个问题吗? 当我试图在 linux 中访问 apache subversion 时遇到了这个问题 “现有连接被远程主机强行关闭”,我无法通过谷歌搜索解决方案可以帮助我解决这个问题
当我通过 HTTP 传输大约 50Mb 的文件时有时我会收到此错误: 无法从传输连接读取数据:远程主机强行关闭了现有连接。 首先,我在 http://stackoverflow.com 下找不到任何解
我有一个更新服务器,它通过 TCP 端口 12000 发送客户端更新。单个文件的发送仅在第一次成功,但之后我在服务器上收到错误消息“无法将数据写入传输连接: 现有连接被远程主机强行关闭”。如果我在服务
我正在编写一个脚本来下载一组文件。我成功地完成了这个并且它工作得很好。现在我尝试添加下载进度的动态打印输出。 对于小型下载(顺便说一下,它是 .mp4 文件),例如 5MB,进度效果很好并且文件成功关
我有一个用 C# 编写的 Winforms 应用程序,它使用来自 Windows 2008 IIS Coldfusion 服务器的 Web 服务。所有 Web 服务调用都成功,只有一个调用失败,大约
我想将一个项目从 TortoiseHg 推送到 GitHub。我知道,TortoiseHg 是 Mercurial 分布式版本控制系统的前端; GitHub 与 Git 一起工作的地方。但我喜欢使用
我有一个服务器应用程序,有时,当客户端尝试连接时,我会收到以下错误: 注意:“无法从客户端获取流或登录失败”是我在 catch 语句中添加的文本 它停止的行(sThread:第 96 行)是: tcp
我是一名优秀的程序员,十分优秀!