socket(poll)

  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(

猜你喜欢

转载自blog.csdn.net/cangqiong_xiamen/article/details/139604356