本文主要是介绍socket(poll),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 什么是Poll
比 起 异 步 程 序 , 同 步 程 序 更 简 单 明 了, 而 且 不 会 引 发 线 程 问 题 。
i f (socket 有可读数据){
socket. Receive ( )
i f (socket 缓冲区可写了 socket.Send()
)
i f (socket 发生程序 ), 错误处理
}
只要在阻塞方法前加上一层判断,有数据可读才调用Receive,有数据 可写才调用 Send,那不就既能够实现功能, 又不会卡住程序了么?可能有人会在心里感叹, 这样的好
微软当然很早就想到了这个解决方法,于是给Socket 类提供了Poll方法,它的原型如下:
public bool Pollint 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。
- 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;//UGUIpublic InputField InputField;public Text text;//接收缓冲区byte[] readBuff = new byte[1024];string recvStr = "";//点击连接按钮public void Connection(){//Socketsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//Connect 这个是同步方法socket.Connect(
这篇关于socket(poll)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!