Socket异步

socket 异步
异步就不用等待都是以Begin开始表示开启异步调用,以End开始表示结束异步调用线程,比如指定接收数据后就会继续执行一下步代码,等到有数据了再跳出当前执行的代码转去执行异步调用。
同步的话通常要配合多线程(否则在阻塞的时候当前线程会停止,如果当前线程是UI线程就表现出好像界面停止的样子)。

服务器

/// 服务器 网络管理类
/// 管理网络 所有连接你服务器的网络用户)
/// 1 统计连接了服务器的客户端 等待客户端连接的方法
/// 2 收取客户端发来的消息
/// 3 发送消息给客户端
/// </summary>
    internal class NetManager : Singleton<NetManager>
    {
        Socket socket;
        public List<Client> clients = new List<Client>();
        public void Init()
        { 
            //地址族       inter net   数据流:一套用于传输数据的类型   协议
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // 继承关系 ip地址访问权限 端口
            socket.Bind(new IPEndPoint(IPAddress.Any, 8888));
            socket.Listen(10);//最大连接数
            //异步等待连接
            socket.BeginAccept(AsyOnAccept, null);
        }

        private void AsyOnAccept(IAsyncResult ar)
        {
            try //try 报错 避免服务器宕机 保持原有功能的实现 
            {
                Socket soc = socket.EndAccept(ar);
                IPEndPoint ip = soc.RemoteEndPoint as IPEndPoint;
                Client client = new Client();
                client.socket = soc;
                client.name = ip.Port.ToString();
                clients.Add(client);

### 实现Socket异步通信 在编程中实现Socket异步通信通常涉及使用操作系统提供的机制来处理I/O多路复用,如`select`、`poll`或更高效的`epoll`(Linux环境下)[^4]。 #### 使用 `select` `select` 函数可以监控多个文件描述符的状态变化。通过它可以在单线程里管理多个套接字连接而无需等待任何一个特定的连接完成操作。下面是一个简单的Python例子展示如何利用 `select` 来创建一个非阻塞服务器: ```python import socket import select server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8080)) server_socket.listen(5) inputs = [server_socket] while True: readable, writable, exceptional = select.select(inputs, [], inputs) for s in readable: if s is server_socket: client_socket, addr = s.accept() inputs.append(client_socket) else: try: data = s.recv(1024) if not data: break # Process the received message here... except Exception as e: inputs.remove(s) s.close() ``` 此代码片段展示了基本框架,在实际应用中还需要加入更多错误处理逻辑以及消息解析等功能。 #### 非阻塞模式配置 要使Socket工作于非阻塞方式下,可以通过设置其为非阻塞状态或者直接初始化时指定参数。例如,在C++中的做法如下所示: ```cpp int sockfd; sockfd = socket(AF_INET, SOCK_STREAM | O_NONBLOCK, 0); // 创建非阻塞套接字 // 或者对于已存在的套接字对象 sock.setblocking(false); ``` 一旦设置了非阻塞标志位之后,任何试图发送/接收数据的行为如果遇到暂时无法满足的情况(比如缓冲区满),将会立刻返回而不是挂起进程直到条件达成。此时应该检查函数的具体返回码以判断是否发生了EAGAIN/EWOULDBLOCK错误,并据此采取相应措施继续尝试其他任务或是稍后再试[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值