ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(游戏)服务器开发的基础

2022-04-19 09:34:44  阅读:207  来源: 互联网

标签:游戏 WebResponse WebRequest uri Uri 开发 wrq 服务器 WebClient


WebClient概述
从MSDN中我们可以得知,WebClient的作用就是“Provides common methods for sending data to and receiving data from a resource identified by a URI.”也就是说我们可 以通过这个类去访问与获取网络上的资源文件。
WebClient类不能被继承,我们可以通过WebRequest和WebResponse这两个类来处理向URI标示 的资源和获取数据了。这两个类功能挺强大的,但不足之处的是利用WebRequest和 WebResponse时设置过于复杂,使用起来颇为费劲。而WebClient可以理解为对WebRequest和 WebResponse等协作的封装。它使人们使用起来更加简单方便,然后它也有先天不足的地 方。那就是缺少对cookies/session的支持,用户无法对是否自动url转向的控制,还有就是 缺少对代理服务器的支持等等,不过我们可以通过重写WebClient的一些方法来实现这些功 能。
WebClient的函数与基本用法
WebClient提供四种将数据上载到资源的方法: OpenWrite 返回一个用于将数据发送到资源的 Stream。 UploadData 将字节数组发送到资源并返回包含任何响应的字节数组。 UploadFile 将本地文件发送到资源并返回包含任何响应的字节数组。 UploadValues 将 NameValueCollection 发送到资源并返回包含任何响应的字节数组。 另外WebClient还提供三种从资源下载数据的方法: DownloadData 从资源下载数据并返回字节数组。 DownloadFile 从资源将数据下载到本地文件。 OpenRead 从资源以 Stream 的形式返回数据。
WebClient与其他网络相关类的区别
WebClient和HttpWebRequst是用来获取数据的2种方式,一般而言,WebClient更倾向于“按 需下载”,事实上掌握它也是相对容易的,而HttpWebRequst则允许你设置请求头或者对内 容需要更多的控制,后者有点类似于form中的submit。虽然两者都是异步请求事件,但是 WebClient是基于事件的异步,而HttpWebRequst是基于代理的异步编程。
WebClient使用范例
private void button1_Click(object sender, RoutedEventArgs e)
{ //通过WebClient方式去获取资源文件 Uri uri = new Uri("http://localhost:2052/Images/cnblogs.png", UriKind.Absolute); WebClient webClient = new WebClient(); webClient.OpenReadAsync(uri); webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); }
void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { Stream stream = e.Result; BitmapImage bitmap = new BitmapImage(); bitmap.SetSource(stream); this.image1.Source = bitmap; }
WebRequest和WebResponse入门案例
public Form1() { WebRequest wrq = WebRequest.Create(""); WebResponse wrs = wrq.GetResponse(); Stream strm = wrs.GetResponseStream(); StreamReader sr = new StreamReader(strm); while ( (line = sr.ReadLine()) != null) { Console.WriteLine(line); } strm.Close(); }
案例分析
WebRequest类是支持不同网络协议的类层次结构的一部分,为了给请求类型接收一个对正确 对象的引用,需要一个工厂(factory)机制。WebRequest.Create()方法会为给定的协议创建 合适的对象。 WebRequest类代表要给某个URI发送信息的请求,URI作为参数传送给Create()方法。 WebResponse类代表从服务器获取的数据。调用WebRequest.GetResponse()方法,实际上是
把请求发送给Web服务器,创建一个Response对象,检查返回的数据。
HTTP标题信息
HTTP协议的一个重要方面就是能够利用请求和响应数据流发送扩展的标题信息。标题信息可 以包括cookies、以及发送请求的特定浏览器(用户代理)的一些详细信息。 WebRequest类和WebResponse类提供了读取标题信息的一些支持。而两个派生的类 HttpWebRequest类和HttpWebResponse类提供了其他HTTP特定的信息。用HTTP URI创建 WebRequest会生成一个HttpWebRequest对象实例。因为HttpWebRequest派生自WebRequest, 可以在需要WebRequest的任何地方使用新实例。 还可以把实例的类型强制转换为HttpWebRequest引用,访问HTTP协议特定的属性。同样,在 使用HTTP时,GetResponse()方法调用会返回WebResponse引用,也可以进行一个简单的强制 转换,以访问HTTP特定的特性。 WebRequest wrq = WebRequest.Create(""); HttpWebRequest hwrq = (HttpWebRequest)wrq; Console.WriteLine("Request Timeout (ms) = " + wrq.Timeout); Console.WriteLine("Request Keep Alive = " + hwrq.KeepAlive); Console.WriteLine("Request AllowAutoRedirect = " + hwrq.AllowAutoRedirect);
imeout属性的单位是毫秒,其默认值是100 000。可以设置这个属性,以控制WebRequest对 象在产生WebException之前要在响应中等待多长时间。可以检查属性 WebException.Status,看看产生异常的原因。这个枚举类型包括超时的状态码、连接失 败、协议错误等。
KeepAlive属性是对HTTP协议的特定扩展,所以可以通过HttpWebRequest引用访问这个属 性。该属性允许多个请求使用同一个连接,在后续的请求中节省关闭和重新打开连接的时 间。其默认值为true。
AllowAutoRedirect属性也是专用于HttpWebRequest类的,使用这个属性可以控制Web请求是 否应自动跟随Web服务器上的重定向响应。其默认值也是true。如果只允许有限的重定向, 可以把HttpWebRequest的MaximumAutomaticRedirections属性设置为想要的数值。
请求和响应类把大多数重要的标题显示为属性,也可以使用Headers属性本身显示标题的总 集合。在GetResponse()方法调用的后面添加如下代码
WebRequest wrq = WebRequest.Create("");
WebResponse wrs = wrq.GetResponse(); WebHeaderCollection whc = wrs.Headers; for(int i = 0; i < whc.Count; i++) { Console.WriteLine("Header " + whc.GetKey(i) + " : " + whc[i]); }
异步页面请求
WebRequest类的另一个特性就是可以异步请求页面。由于在给主机发送请求到接收响应之间 有很长的延迟,因此,异步请求页面就显得比较重要。像WebClient.DownloadData()和 WebRequest.GetResponse()等方法,在响应没有从服务器回来之前,是不会返回的。 如果不希望在那段时间中应用程序处于等待状态,可以使用BeginGetResponse() 方法和 EndGetResponse()方法,BeginGetResponse()方法可以异步工作,并立即返回。在底层,运 行库会异步管理一个后台线程,从服务器上接收响应。 BeginGetResponse() 方法不返回WebResponse对象,而是返回一个执行IAsyncResult接口的 对象。使用这个接口可以选择或等待可用的响应,然后调用EndGetResponse()搜集结果。 也可以把一个回调委托发送给BeginGetResponse()方法。该回调委托的目的地是一个返回类 型为void并把IAsyncResult引用作为参数的方法,当工作线程完成了搜集响应的任务后,运 行库就调用该回调委托,通知用户工作已完成。如下面的代码所示,在回调方法中调用 EndGetResponse()可以接收WebResponse对象: public Form1() { InitializeComponent(); WebRequest wrq = WebRequest.Create(""); wrq.BeginGetResponse(new AsyncCallback(OnResponse), wrq); } protected void OnResponse(IAsyncResult ar) { WebRequest wrq = (WebRequest)ar.AsyncState; WebResponse wrs = wrq.EndGetResponse(ar); // read the response ... }
实用工具类-URI
Uri和UriBuilder是System命名空间下的两个类。UriBuilder可以通过给定的字符串,从而 构建一个URI,而Uri类可以分析,组合和比较URI。 1,创建Uri类 Uri uri = new Uri("http://www.microsoft.com/somefolder/somefile.htm? order=true");
2,分析Uri取得一些属性 string query = uri.Query;// ?order=true 得到参数部分 string absPath = uri.AbsolutePath; // /somefoler/somefile.htm 得到路径 部分 string scheme = uri.Scheme; // http 得到协议 int port = uri.Port ; // 80 访问端口 string host = uri.Host; // www.microsoft.com bool isDefaultPort = uri.IsDefaultPort;
番外:URI和URL的区别
https://www.pianshen.com/article/50261935688/ https://www.jianshu.com/p/ba15d066f777
实用工具类-UriBuilder
UriBuilder builder = new UriBuilder("http","www.microsoft.com",80,"somefolder/somefile.htm"); 也可以单独给每个属性部分赋值 builder.Scheme = "http"; builder.Host="www.microsoft.com"; builder.Port = 80; builder.Path="somefolder/somefile.htm";
//通过builder构建uri Uri completeUri = builder.Uri;
实用工具类-IPAddress
创建IP地址 IPAddress ipAddress = IPAddress.Parse("234.34.5.3"); byte[] address = ipAddress.GetAddressBytes();//得到四个位置上的具体值
string ipString = ipAddress.ToString();//得到ip的字符串
实用工具类-Dns和IPHostEntry
IPHostEntry ipentry = Dns.Resolve("www.baidu.com"); IPHostEntry ipentry = Dns.GetHostByAddress("23.34.3.43");
通过域名或者ip地址获取主机信息

标签:游戏,WebResponse,WebRequest,uri,Uri,开发,wrq,服务器,WebClient
来源: https://www.cnblogs.com/coyang/p/16163790.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有