socket编程异步模式(C# Socket 异步通讯)

本文目录
C# Socket 异步通讯
这样写异步处理方法没错,异步处理TCP连接就是这样写的!
在异步RecVing方法中有两点可以改进:
1)增加异常处理,目的是:即使发生异常也保证Socket能正常工作。
2)调用 EndAceept返回的是正在与客户端连接的sockt
private static void RecVing(IAsyncResult Result)
{
//通过 result 获取socket。在这个socket上你启动了BeginAccept操作
Socket socket = Result.AsyncState as Socket;
Socket Res_soc = null; //这个是与当前客户端连接的Socket
Socket_Business business = new Socket_Business();
try
{
// 通过EndAccept,获取与当前客户端连接的Socket
Res_soc = socket.EndAccept(Result);
Console.WriteLine("连接成功!");
byte;
int i = Res_soc.Receive(bytes);
string cmdstr = System.Encoding.Default.GetString(bytes, 0, i);
Console.WriteLine(cmdstr);
business.Business(bytes, Res_soc);
send(Res_soc);
}
catch
{
// 发生异常时,释放Res_soc
if(Res_soc != null) Res_soc = null;
}
finally //利用finally 确保无论发生什么异常都能够让socket继续接收连接
{
//继续异步等待连接
socket.BeginAccept(new AsyncCallback(RecVing), socket);
}
}
另外:楼上“许惘然”的说法是不对的。因为Res_soc是定义在RecVing中的个局部变量,当从RecVing中退出后,这个被变量自动释放掉了。
C# SOCKET 异步接收的问题
socket传输中拿tcp传输为例。假设服务器a
客户机b进行通信传输。首先需要在a机建立监听线程。监听某一端口,那么b机可以向a机发送通讯请求,b机连接到a机以后。a机可以从他的监听队列中取的一个监听对象。在a端拿到了这个socket对象就可以进行接收跟发送数据了。这里问题就出现了。假如b端在请求a端的时候请求成功就发送一条数据。那么
a端就可以直接拿socket对象得到他的信息。但是假如b端并没有在连接成功后直接发送信息而是在后来不确定的时间这内发送的信息。那么a端就无法得到这条信息。通常的做法是用一个定时器去不短的扫描这个数据缓存区。看是不是有数据存在这样效率非常低下。那么如何解决这个问题呢。就用到了我们的异步传输。异步传输的原理是。在a端得到这个socket对象以后并不是直接去接收数据而是建立一个回调函数。回调函数是由系统维护的。他在指定的时间自动去扫描数据存储区。假如有数据他就把数据存储到指定的字节数组中。不用用户自己去关心。
那么同步与异步分别应用于什么情况呢?假如用户的socket连接数据比较短暂的。一次连接直接发送数据的或客户端比较少的就使用同步假如用户的socket属于长时间连接的就使用异步方式
luasocket怎么异步connect
这个是C#的东西。 函数原型如下: public IAsyncResult BeginConnect( EndPoint remoteEP, AsyncCallback callback, Object state ) public bool ConnectAsync( SocketAsyncEventArgs e ) 他们都开始一个对远程主机连接的异步请求。
关于c#的Socket异步网络编程问题
这样的写法有点问题:
1)服务器端既然采用了异步方式Accept,就没有必要再启线程
2)估计allDone是一个ManualResetEvent。用ManualResetEvent的目的什么呢?
服务器端采用异步Accept的代码其实很简单,也不需要ManualResetEvent同步
public class AppTCPServer
{
public AppTCPServer(string localIP, int port)
{
Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
EndPoint localEP = new IPEndPoint(IPAddress.Parse(localIP), port);
socket.Bind(localEP);
socket.Listen(100);
socket.BeginAccept(AcceptAsync, socket);
}
private void AcceptAsync(IAsyncResult ar)
{
Socket socket = ar.AsyncState as Socket;
try
{
Socket client = socket.EndAccept(ar);
Console.WriteLine("客户端连接成功!客户端:{0}", client.RemoteEndPoint.ToString());
if (OnConnected != null)
{
OnConnected(this, new ClientConnectedEventArgs(client));
}
}
catch (Exception e)
{
Console.WriteLine("AcceptAsync发生异常,异常信息:\n{0}", e.Message);
}
finally
{
//继续异步Accept
socket.BeginAccept(AcceptAsync, socket);
}
}
//客户端连接后的事件 OnConnect
public event EventHandler《ClientConnectedEventArgs》 OnConnected;
}
/// 《summary》
/// 事件参数:接收客户端连接后的事件参数
/// 《/summary》
public class ClientConnectedEventArgs : EventArgs
{
public ClientConnectedEventArgs(Socket clientSocket)
{
ClientSocket = clientSocket;
}
public Socket ClientSocket { get; private set; }
}
class Program
{
static void Main(string args)
{
AppTCPServer server = new AppTCPServer("127.0.0.01", 8000);
server.OnConnected += server_OnConnected;
Console.WriteLine("按任意键结束程序……");
Console.ReadKey();
}
static void server_OnConnected(object sender, ClientConnectedEventArgs e)
{
Socket client = e.ClientSocket;
string hello = "Hello from AppTCPServer";
client.Send(Encoding.Default.GetBytes(hello));
}
}
客户端测试程序
class Program
{
static void Main(string args)
{
//模拟100个客户连接服务器
for (int i = 0; i 《 100; i++)
{
Socket socket = ConnectToServer("127.0.0.1", 8000);
byte;
int bytesRecevied = socket.Receive(buffer, buffer.Length, SocketFlags.None);
byte;
Array.Copy(buffer, messageBytes, bytesRecevied);
Console.WriteLine(Encoding.Default.GetString(messageBytes));
socket.Disconnect(false);
socket.Close();
}
Console.ReadKey();
static Socket ConnectToServer(string serverIP, int serverPort)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
EndPoint localEP = new IPEndPoint(IPAddress.Any, 0);
socket.Bind(localEP);
socket.Connect(new IPEndPoint(IPAddress.Parse(serverIP), serverPort));
return socket;
}
}

更多文章:
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20
scrollthrough意思(“scroll”是什么意思)
2026年9月7日 08:00
怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)
2026年9月7日 06:30



