c# Socket编程基础知识

2024-09-06 12:58

本文主要是介绍c# Socket编程基础知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这一篇文章,将图文并茂地介绍Socket编程的基础知识,我相信,如果你按照步骤做完实验,一定可以对Socket编程有更好地理解。

本文源代码,可以通过这里下载 http://files.cnblogs.com/chenxizhang/SocketWorkshop.rar

 

第一步:创建解决方案

image

第二步:创建服务端程序

这里可以选择“Console Application”这个类型,比较方便调试

image

然后编写如下代码,实现服务器的基本功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//额外导入的两个命名空间
using System.Net.Sockets;
using System.Net;namespace SocketServer
{class Program{/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);Console.WriteLine("Server is ready!");Console.Read();}}
}

 

 

现在可以启动调试一下看看效果如何,正常情况下应该会看到一个提示,因为我们需要在TCP 4530端口进行监听,所以防火墙会有提示。

image

点击“Allow access”

image

这样,我们的服务器就可以开始监听了。但是这有什么用呢?是的,没有什么用。

我们还需要为服务器添加一些功能,例如接受传入的请求,给客户端发送消息,或者从客户端接收消息等等

第三步:接受传入的请求

我们需要通过Accept,或者(BeginAccept)来接受传入的请求,请注意下面代码中的红色部分

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//额外导入的两个命名空间
using System.Net.Sockets;
using System.Net;namespace SocketServer
{class Program{/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);            //开始接受客户端连接请求//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspxsocket.BeginAccept(new AsyncCallback((ar) =>{//这就是客户端的Socket实例,我们后续可以将其保存起来var client = socket.EndAccept(ar);//给客户端发送一个欢迎消息client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));}), null);Console.WriteLine("Server is ready!");Console.Read();}}
}

 

 

wow,看起来不错对吧,我们赶紧做一个客户端来测试一下吧

 

第四步:创建客户端

我们还是使用一个Console Application

image

添加如下的代码,并且创建客户端连接

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//导入的命名空间
using System.Net.Sockets;namespace SocketClient
{class Program{/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//创建一个Socketvar socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//连接到指定服务器的指定端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspxsocket.Connect("localhost", 4530);Console.WriteLine("connect to the server");Console.Read();}}
}

 

 

依次选择SocketServer和SocketClient这两个项目,分别将其启动为调试状态(右键菜单,Debug=>Start new instance)

image

我们看到两个程序都工作正常。

但是,在客户端怎么没有收到服务器发过来的消息呢?那是因为,我们没有在客户端提供这方面的功能。

 

第五步:在客户端中实现接受消息的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//导入的命名空间
using System.Net.Sockets;namespace SocketClient
{class Program{/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//创建一个Socketvar socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//连接到指定服务器的指定端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspxsocket.Connect("localhost", 4530);//实现接受消息的方法            var buffer = new byte[1024];//设置一个缓冲区,用来保存数据//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspxsocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback((ar) =>{//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspxvar length = socket.EndReceive(ar);//读取出来消息内容var message = Encoding.Unicode.GetString(buffer, 0, length);//显示消息Console.WriteLine(message);}), null);Console.WriteLine("connect to the server");Console.Read();}}
}

 

请注意以上红色的部分,我们用了BeginReceive方法进行异步的消息侦听,如果收到了,我们就打印出来

image

看起来已经实现了我们需求了:服务器给客户端发了一个消息,而客户端也已经收到了。

但是,这远远不够,因为它们之间的通讯不仅仅是一次性的,那么如果服务器要不断地给客户端发消息,例如每隔两秒钟就发送一个消息,如何实现呢?

 

第六步:实现服务器定期向客户端发消息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//额外导入的两个命名空间
using System.Net.Sockets;
using System.Net;namespace SocketServer
{class Program{/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);//开始接受客户端连接请求//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspxsocket.BeginAccept(new AsyncCallback((ar) =>{//这就是客户端的Socket实例,我们后续可以将其保存起来var client = socket.EndAccept(ar);//给客户端发送一个欢迎消息client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));                //实现每隔两秒钟给服务器发一个消息//这里我们使用了一个定时器var timer = new System.Timers.Timer();timer.Interval = 2000D;timer.Enabled = true;timer.Elapsed += (o, a) =>{client.Send(Encoding.Unicode.GetBytes("Message from server at " +DateTime.Now.ToString()));};timer.Start();}), null);Console.WriteLine("Server is ready!");Console.Read();}}
}

 

 

我们还要实现在客户端一直监听消息的机制,而不是一次性接收.请注意下面红色的部分

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//导入的命名空间
using System.Net.Sockets;namespace SocketClient
{class Program{/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//创建一个Socketvar socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//连接到指定服务器的指定端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspxsocket.Connect("localhost", 4530);Console.WriteLine("connect to the server");//实现接受消息的方法//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage),socket);Console.Read();}        static byte[] buffer = new byte[1024];public static void ReceiveMessage(IAsyncResult ar){try{var socket = ar.AsyncState as Socket;//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspxvar length = socket.EndReceive(ar);//读取出来消息内容var message = Encoding.Unicode.GetString(buffer, 0, length);//显示消息Console.WriteLine(message);//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);}catch(Exception ex){Console.WriteLine(ex.Message);}}}
}

 

重新调试起来,看起来的效果如下图所示

image

我们继续做下面的实验,一步一步地研究Socket通讯中可能遇到的一些问题

请先关闭掉客户端这个程序,而不要关闭服务端程序,这时会发现一个错误

image

这个错误很容易理解,因为客户端已经关闭,也就是客户端那个Socket已经不存在了,服务器还继续向它发送消息当然会出错。所以,从可靠性方面的考虑,我们必须在发送消息之前检测Socket的活动状态

 

第七步:检测客户端的活动状态

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//额外导入的两个命名空间
using System.Net.Sockets;
using System.Net;namespace SocketServer
{class Program{/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);//开始接受客户端连接请求//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspxsocket.BeginAccept(new AsyncCallback((ar) =>{//这就是客户端的Socket实例,我们后续可以将其保存起来var client = socket.EndAccept(ar);//给客户端发送一个欢迎消息client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));//实现每隔两秒钟给服务器发一个消息//这里我们使用了一个定时器var timer = new System.Timers.Timer();timer.Interval = 2000D;timer.Enabled = true;timer.Elapsed += (o, a) =>{
                    //检测客户端Socket的状态if(client.Connected){try{client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));}catch(SocketException ex){Console.WriteLine(ex.Message);}}else{timer.Stop();timer.Enabled = false;Console.WriteLine("Client is disconnected, the timer is stop.");}};timer.Start();}), null);Console.WriteLine("Server is ready!");Console.Read();}}
}

 

上面代码的逻辑很清楚,但有时候还是会触发那个SocketException。为什么呢?这是因为我们的Timer是每隔两秒钟检查一次,那么就很可能有一种情况,我们检查的时候,它还是连接状态,消息发出去之后,它断开了。这种情况肯定是存在的。所以要用Try..catch的结构

 

目前我们实现的场景很简单,服务器只管发消息,客户端只管收消息。但实际工作中,可能希望服务器和客户端都能收发消息。请看下一节

 

第八步:实现双向收发消息

先看服务端的修改

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//额外导入的两个命名空间
using System.Net.Sockets;
using System.Net;namespace SocketServer
{class Program{/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);//开始接受客户端连接请求//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspxsocket.BeginAccept(new AsyncCallback((ar) =>{//这就是客户端的Socket实例,我们后续可以将其保存起来var client = socket.EndAccept(ar);//给客户端发送一个欢迎消息client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));//实现每隔两秒钟给服务器发一个消息//这里我们使用了一个定时器var timer = new System.Timers.Timer();timer.Interval = 2000D;timer.Enabled = true;timer.Elapsed += (o, a) =>{//检测客户端Socket的状态if(client.Connected){try{client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));}catch(SocketException ex){Console.WriteLine(ex.Message);}}else{timer.Stop();timer.Enabled = false;Console.WriteLine("Client is disconnected, the timer is stop.");}};timer.Start();              //接收客户端的消息(这个和在客户端实现的方式是一样的)client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveMessage),client);}), null);Console.WriteLine("Server is ready!");Console.Read();}        static byte[] buffer = new byte[1024];public static void ReceiveMessage(IAsyncResult ar){try{var socket = ar.AsyncState as Socket;//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspxvar length = socket.EndReceive(ar);//读取出来消息内容var message = Encoding.Unicode.GetString(buffer, 0, length);//显示消息Console.WriteLine(message);//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);}catch(Exception ex){Console.WriteLine(ex.Message);}}}
}

可以看出来,为了让服务器可以接受消息,其实并不需要什么特别的设计,与客户端接受消息其实可以是一样的

 

再来看看客户端的修改

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//导入的命名空间
using System.Net.Sockets;namespace SocketClient
{class Program{/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//创建一个Socketvar socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//连接到指定服务器的指定端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspxsocket.Connect("localhost", 4530);Console.WriteLine("connect to the server");//实现接受消息的方法//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspxsocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);            //接受用户输入,将消息发送给服务器端while(true){var message = "Message from client : " + Console.ReadLine();var outputBuffer = Encoding.Unicode.GetBytes(message);socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);}}static byte[] buffer = new byte[1024];public static void ReceiveMessage(IAsyncResult ar){try{var socket = ar.AsyncState as Socket;//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspxvar length = socket.EndReceive(ar);//读取出来消息内容var message = Encoding.Unicode.GetString(buffer, 0, length);//显示消息Console.WriteLine(message);//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);}catch(Exception ex){Console.WriteLine(ex.Message);}}}
}

 

我在这里做了一个死循环,用户可以不断地输入,这些消息会被发送给服务器。如下图所示

image

【备注】因为服务器每隔两秒钟会发送新消息过来,所以在输入的时候,动作要稍快一点啦

 

本文最后探讨一个问题,就是如何让我们的服务器可以支持多个客户端

 

第九步:支持多个客户端

这个步骤只需要修改服务端程序即可

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//额外导入的两个命名空间
using System.Net.Sockets;
using System.Net;namespace SocketServer
{class Program{/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args){//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspxsocket.Bind(new IPEndPoint(IPAddress.Any, 4530));//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspxsocket.Listen(4);//开始接受客户端连接请求//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx     socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);Console.WriteLine("Server is ready!");Console.Read();}        public static void ClientAccepted(IAsyncResult ar){var socket = ar.AsyncState as Socket;//这就是客户端的Socket实例,我们后续可以将其保存起来var client = socket.EndAccept(ar);//给客户端发送一个欢迎消息client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));//实现每隔两秒钟给服务器发一个消息//这里我们使用了一个定时器var timer = new System.Timers.Timer();timer.Interval = 2000D;timer.Enabled = true;timer.Elapsed += (o, a) =>{//检测客户端Socket的状态if(client.Connected){try{client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));}catch(SocketException ex){Console.WriteLine(ex.Message);}}else{timer.Stop();timer.Enabled = false;Console.WriteLine("Client is disconnected, the timer is stop.");}};timer.Start();//接收客户端的消息(这个和在客户端实现的方式是一样的)client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);//准备接受下一个客户端请求socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);}static byte[] buffer = new byte[1024];public static void ReceiveMessage(IAsyncResult ar){try{var socket = ar.AsyncState as Socket;//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspxvar length = socket.EndReceive(ar);//读取出来消息内容var message = Encoding.Unicode.GetString(buffer, 0, length);//显示消息Console.WriteLine(message);//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);}catch(Exception ex){Console.WriteLine(ex.Message);}}}
}

 

最后调试起来看到的效果如下图

image

这篇关于c# Socket编程基础知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142074

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念