- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
首先,
语言:C#
目标:用于图像和对象传输的 TCP 服务器/客户端。
服务器场景:服务器将监听客户端连接。
客户端连接后,服务器将从套接字接收byte[]数据
Server会将byte[]转换成(Type)object。
然后服务器将使用此(类型)对象来更新 WPF 图像控件
客户端场景:
客户端将创建准备传输的对象。
客户端会将对象转换为存储的字节[]。
客户端将连接到服务器并通过套接字发送对象
问题:
我不确定为什么这个进程每秒增加 60-100MB 的内存使用量。
我想知道 Byte[] 分 block 是否是一个值得的解决方案(如果是的话,请给我指点资源或提供解决方案)
感觉它没有正确清理自身或重新使用变量。
注意事项:
Bitmap Capture and Convert to Byte[] 运行良好据我所知这不是问题,但如果问题不在下面的代码中或者其他人会受益,我可以发布代码。
ObjecttoByte[] 和 ByteArrayToObject 代码有效,并从其他堆栈溢出帖子中略微修改,如果问题不在下面的代码中或者其他人会受益,那么我可以发布它。
服务器监听器代码:
public void StartServer()
{
//-------------------------------------------------------
// Initialize Variables For Server
//-------------------------------------------------------
int recv;
byte[] data;
//-------------------------------------------------------
// Configure Server Listener
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Bind Socket To IPEndpoint And Listen
//-------------------------------------------------------
newsock.Bind(ipep);
newsock.Listen(10);
//-------------------------------------------------------
// Accept New Connection
//-------------------------------------------------------
Console.WriteLine("Waiting for a client...");
Socket client = newsock.Accept();
//-------------------------------------------------------
// Verify Client Endpoint Connection
//-------------------------------------------------------
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);
//-------------------------------------------------------
// Start Reading From Socket While Client Connected
//-------------------------------------------------------
while (client.Connected)
{
data = new byte[500000]; // Create Buffer For Object
recv = client.Receive(data); // Ensure Client Has Sent Data
if (recv == 0)
break;
//-------------------------------------------------------
// Create Test Object And De-Serialize
//-------------------------------------------------------
TestObject to = new TestObject(); //Object For Storage
Console.WriteLine("Server Object Size: " + data.Length); // Check Length For Interest
var dataToObject = ByteArrayToObject(data); // Convert Object Byte[] to Object
to = (TestObject)dataToObject; // Store Converted Byte[] Object into Typed Object
Console.WriteLine("Server De-Serialized Object from Client."); // Provide Information
Console.Out.WriteLine("Server TestObject: " + to.testString); // Extract And Notify Object String Data
//-------------------------------------------------------
// Update Main GUI Image (WPF)
//-------------------------------------------------------
this.Dispatcher.Invoke((Action)(() =>
{
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); // Create Type Converter
Bitmap bitmap1 = (Bitmap)tc.ConvertFrom(to.testBmp); // Cast into Bitmap from Byte[]
imgRemoteDisplay.Source = ByteMonImaging.GetBitmapSource(bitmap1); // Display Bitmap
bitmap1 = null;
tc = null;
}));
//-------------------------------------------------------
// Clean Up
//-------------------------------------------------------
dataToObject = null;
data = null;
to = null;
GC.Collect();
//-------------------------------------------------------
}
Console.WriteLine("Disconnected from {0}", clientep.Address);
//-------------------------------------------------------
// Close Listener
//-------------------------------------------------------
client.Close();
newsock.Close();
}
客户端连接代码:
public void ConnectClient()
{
//-------------------------------------------------------
// Configure Server Connection
//-------------------------------------------------------
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//-------------------------------------------------------
// Establish Connection To Server
//-------------------------------------------------------
try
{
server.Connect(ipep);
}
catch (SocketException e)
{
Console.WriteLine("Unable to connect to server.");
Console.WriteLine(e.ToString());
return;
}
//-------------------------------------------------------
// Start Sending Object To Server While Connected
//-------------------------------------------------------
while(server.Connected)
{
TestObject to = new TestObject(); // Create blank object store
to.testString = "TestObject String Here"; // Set Blank Object Test String
var bmpToSend = ByteMonImaging.CaptureBitmap(); // Set Blank Object Test Bitmap
to.testBmp = ByteMonImaging.ImageToByte(bmpToSend); // Convert Bitmap to Byte[]
var byteArray = ObjectToByteArray(to); // Pack Object into Byte[]
Console.WriteLine("Client Object Size: " + byteArray.Length); // Curious Byte[] Size
server.Send(byteArray); // Send Byte[] Object Via TCP
Console.WriteLine("Client Sent Serialized Object to Server."); // Notify Where We Are At
bmpToSend = null; // Clean Up
to = null; // Clean Up
byteArray = null; // Clean Up
GC.Collect(); // Clean Up (Added for Checks)
}
//-------------------------------------------------------
// Close Connection to Socket And Server
//-------------------------------------------------------
Console.WriteLine("Disconnecting from server...");
server.Shutdown(SocketShutdown.Both);
server.Close();
}
内存消耗原因定位
//-------------------------------------------------------
// Update Main GUI Image (WPF)
//-------------------------------------------------------
this.Dispatcher.Invoke((Action)(() =>
{
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); // Create Type Converter
Bitmap bitmap1 = (Bitmap)tc.ConvertFrom(to.testBmp); // Cast into Bitmap from Byte[]
imgRemoteDisplay.Source = ByteMonImaging.GetBitmapSource(bitmap1); // Display Bitmap
bitmap1 = null;
tc = null;
}));
解决方案: 问题是 hBitmap 在调用时导致内存泄漏。使用 finally 子句,我能够使用 externdll 删除对象。
[DllImport("gdi32")]
static extern int DeleteObject(IntPtr ipObj);
public static BitmapSource GetBitmapSource(Bitmap bmp)
{
IntPtr hBitmap = bmp.GetHbitmap();
System.Windows.Media.Imaging.BitmapSource b;
try
{
b = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(hBitmap);
}
return b;
}
最佳答案
解决方案: 问题是 hBitmap 在调用时导致内存泄漏。使用 finally 子句,我能够使用 externdll 删除对象。
[DllImport("gdi32")]
static extern int DeleteObject(IntPtr ipObj);
public static BitmapSource GetBitmapSource(Bitmap bmp)
{
IntPtr hBitmap = bmp.GetHbitmap();
System.Windows.Media.Imaging.BitmapSource b;
try
{
b = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(hBitmap);
}
return b;
}
关于sockets - C# TCP 服务器/客户端对象传输/序列化/反序列化越来越多地使用内存帮助需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26985782/
我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我的第一个想法如下: 我在服务器上创建了一个中央 ServerSocket,所有应用程序都可以连接到该服务器。
我正在 Unity 中构建多人游戏。为此,我必须将一些值从客户端发送到两个或多个通过服务器连接的客户端。我想将其构建为服务器真实游戏。客户端将使用 Android,他们的数据将通过服务器同步(可能是一
练习 C 网络编程:我正在编写一个简单的 TCP 客户端-服务器应用程序,它应该将消息(在每个客户端的单独线程中)作为字符串从服务器发送到客户端并在客户端(稍后将成为控制台商店应用程序)。我首先发送消
我使用证书身份验证设置了 AWS Client VPN。我正在为客户端-客户端访问系统进行设置,基本上如 this AWS scenario/example 中所述.一切正常,如果我知道他们的 IP
我正在开发一个小型客户端1/客户端2、服务器(线程)TCP 游戏。在尝试处理延迟问题时,我意识到我的 transmitState() 中存在缺陷。它强制将不必要的信息传递到通讯流中,从而造成迟缓,将汽
来自文档:Configurable token lifetimes in Azure Active Directory (Public Preview) 它提到“ secret 客户端”,刷新 tok
Apollo 客户端开发工具无法连接到我的应用程序。我已在 ApolloClient 构造函数中将 connectToDevTools 传递为 true,但没有任何 react 。我也试过this p
我想在 Pod 内使用 Fabric8 kubernetes 客户端 (java)。如何获取部署集群的 kubernetes 客户端? 我可以使用该集群的 kubeconfig 文件获取任何集群的配置
我正在阅读 the security issue with Log4j我了解此产品受此漏洞影响。但是 Oracle 客户端 11.2 和 12 是否受此问题影响? 我找不到这些产品是否使用任何 Log
Eureka 服务器设置 pom.xml 1.8 Hoxton.SR1 org.springframework.cloud spring
我有一个点对点(客户端/服务器)设置(通过本地 LAN),它使用 Netty,一个 Java 网络框架。我使用原始 TCP/IP(例如,没有 HTTP)进行通信和传输。现在,根据要求,我们希望转向 T
上一篇已经实现了ModbusTcp服务器和8个主要的功能码,只是还没有实现错误处理功能。 但是在测试客户端时却发现了上一篇的一个错误,那就是写数据成功,服务器不需要响应。 接下来要做的就是实现Modb
有没有办法将二维十六进制代码数组转换为 png 图像? 数组看起来像这样(只是更大) [ [ '#FF0000', '#00FF00' ], [ '#0000FF'
我是套接字编程的新手。每次我运行客户端程序时,它都会说“无法连接到服务器”。谁能告诉我我在哪里犯了错误。任何帮助将不胜感激。 这是client.c #include #include #inclu
我们在UNIX环境下制作了简单的client.c和server.c程序。我们使用它来传输一个简单的文本文件,首先打开它,然后读取它并使用 open、read 和 send 系统调用发送;在客户端,我接
当我的程序来自 my previous question正在响应客户端,它应该发送加密消息。 当客户端连接时,它会发送一条类似“YourMessage”的消息。现在我想做的是,当客户端连接时,应该以某
我正在使用 C 和 putty 编写客户端/服务器程序。两个 c 文件位于同一系统上。 我目前在向客户端写回其正在使用的框架以及打印我的框架时遇到问题。它打印出 3 0 9 8,但随后开始打印 134
我正在使用 C 中的 select() 制作一个模拟快餐或其他任何东西的客户端服务器。 我有客户随机点 1-5 种“食物”。服务器每 30 秒决定一次。所有客户最喜欢的食物是什么?他为那些客户提供服务
对于单机游戏,基本的游戏循环是(来源:维基百科) while( user doesn't exit ) check for user input run AI move enemies
1、CentOS安装TortoiseSVN 复制代码 代码如下: yum install -y subversion 2、SVN客户端命令
我是一名优秀的程序员,十分优秀!