socket(poll)

本文介绍了如何使用Socket的Poll方法来避免阻塞,实现客户端和服务端的非阻塞通信。通过设置Poll的参数,可以检查Socket是否可读或可写,从而在有数据时进行接收或发送,解决了阻塞问题。服务端则通过循环检测监听Socket和客户端Socket的状态,响应连接请求并处理消息。
摘要由CSDN通过智能技术生成
  1. 什么是Poll
    比 起 异 步 程 序 , 同 步 程 序 更 简 单 明 了, 而 且 不 会 引 发 线 程 问 题 。
i f (socket 有可读数据){
   
socket. Receive ( )
i f (socket 缓冲区可写了 socket.Send()
)
i f (socket 发生程序 ), 错误处理
}

只要在阻塞方法前加上一层判断,有数据可读才调用Receive,有数据 可写才调用 Send,那不就既能够实现功能, 又不会卡住程序了么?可能有人会在心里感叹, 这样的好

微软当然很早就想到了这个解决方法,于是给Socket 类提供了Poll方法,它的原型如下:

public bool Poll
   int microSeconds, SelectMode mode
)

Poll 的参数说明

参数 说明
microSeconds 等待回应的时间,以微秒为单位,如果该参数为- 1,表示一直等待,如果为0,表示非阻塞
mode 有3种可选的模式, 分别如下: SelectRead : 如果 Socket 可读 (可以接收数据), 返回true , 否则返回false ; Select Write: 如果Socket 可写, 返回true, 否则返回false; SelectError: 如果 连接失败, 返回 true , 否则返回 false

Poll 方法将会检查Socket的状态。如果指定mode 参数为SelectMode.SelectRead,则 可 确定Socket
是否为 可读;指定参数为Select Mode.SelectWrite,可确定Socket 是否为可 写 ; 指 定 参 数 为 SelectMode.SelectError , 可以检测错误条件 。 Pol l将在
指定的时段 (以微秒为单位)内阻止执行,如果希望无限期地等待响应, 可将microSeconds设置为一个负整
数; 如果希望不阻塞, 可将microSeconds设置为0。

  1. Poll客户端
    卡住客户端的最大“罪犯〞就是阻塞Receive 方法,如果能在Update里面不停地判断 有 没 有 数 据 可 读 , 如 果 有 数 据 可读 才 调 用 Receive , 那不就解决问 题了么 ? 代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using UnityEngine.UI;
using System.Threading;
using System;

public class Echo : MonoBehaviour
{
   
    //定义套接字
    Socket socket;
    //UGUI
    public InputField InputField;
    public Text text;

    //接收缓冲区
    byte[] readBuff = new byte[1024];
    string recvStr = "";

    //点击连接按钮
    public void Connection()
    {
   
        //Socket
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
        //Connect 这个是同步方法
        socket.Connect(
  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值