网络编程

  从上面的介绍可以看出,SignalR既然是为实时而生的,这样就决定了其使用场所。具体适用情景有如下几点:

前置操作

软件名:anaconda 
版本:Anaconda3-5.0.1-Windows-x86_64清华镜像 
下载链接:

软件名:Pycharm 
版本:pycharm-professional-2017.3.2  下载地址:百度即可

软件名:python   
版本:3.6      下载地址:python.org

 


 

       
使用C#进行网络编程时,通常都需要用到System.Net命名空间、System.Net.Sockets命名空间和System.Net.Mail命名空间;

 

conda安装

1.
System.Net命名空间:
为当前网络上使用的多种协议提供了简单的编程接口。

  • 聊天室,如在线客服系统,IM系统等
  • 股票价格实时更新
  • 消息的推送服务
  • 游戏中人物位置的实时推送 : 游戏参考

Step 1: anaconda安装及注意事项

  1. 默认步骤安装
  2. 安装中勾选添加环境变量 
      图片 1
  3. 安装完成后,可以在Windows的cmd中执行python命令,看是否可以进入python运行界面

  4. 查看系统环境变量中的用户path变量(我的信息如右):C:\Anaconda3;C:\Anaconda3\Library\mingw-w64\bin;C:\Anaconda3\Library\usr\bin;C:\Anaconda3\Library\bin;C:\Anaconda3\Scripts

  5. 查看安装完成的包:
    Windows命令行执行:conda list
  1. DNS类:DNS是一个静态类,它从Internet域名系统(DNS)检索关于特定主机的信息,在IPHostEntry类的实例中返回来自DNS查询的主机信息。(GetHostName()找到本地系统的主机名,然后再用GetHostByName()找到主机的IP地址)
  2. IPAddress类:包含计算机在IP网络上的地址,主要用来提供网际协议(IP)地址。
  3. IPEndPoint类包含应用程序连接到主机上的服务所需要的主机和本地或远程端口信息。主要用来将网络端点表示为IP地址和端口号。
  4. WebClient类:提供向URL标识的任何本地、Intranet或Internet资源发送数据以及从这些资源接收数据的公共方法。
  5. WebRequest类:.Net
    Framework的请求/响应模型的抽象基类,用于访问Internet数据。使用该请求/响应模型的应用程序可以用协议不可知的方式从Internet请求数据。

 

Step 2:   安装pycharm

  1. 自定义一个步骤,至于cdkey,csdn很多
  2. pycharm关联conda中的python解释器的方法,参考链接: 

 

2. System.Net.Sockets命名空间

Asp.net
SignalR是微软为实现实时通信的一个类库。一般情况下,signalR会使用JavaScript的长轮询(long
polling)的方式来实现客户端和服务器通信,随着Html5中WebSockets出现,SignalR也支持WebSockets通信。另外SignalR开发的程序不仅仅限制于宿主在IIS中,也可以宿主在任何应用程序,包括控制台,客户端程序和Windows服务等,另外还支持Mono,这意味着它可以实现跨平台部署在Linux环境下。

官方安装 

       
主要提供制作Sockets网络应用程序的相关类,其中Socket类,TcpClient类、TcpListener类和UdpClient类较为常用。在.NET框架下开发时,直接使用System.Net.Sockets名称空间中的Socket类编程较为复杂,而应用层的类TcpClient、TcpListener
和 UdpClient为 Socket
通信提供了更简单、对用户更友好的接口。它们和Socket类之间的这种层次关系如图

  signalR内部有两类对象:

Step 3:  安装python3

  1. 进入python.org下载最新python,链接:
  2. 安装python3.6时注意勾选添加环境变量选项,图片 2

     

  3. pip安装 图片 3

     

     

     

图片 4

  1. Http持久连接(Persisten
    Connection)对象:用来解决长时间连接的功能。还可以由客户端主动向服务器要求数据,而服务器端不需要实现太多细节,只需要处理PersistentConnection
    内所提供的五个事件:OnConnected, OnReconnected, OnReceived, OnError
    和 OnDisconnect 即可。
  2. Hub(集线器)对象:用来解决实时(realtime)信息交换的功能,服务端可以利用URL来注册一个或多个Hub,只要连接到这个Hub,就能与所有的客户端共享发送到服务器上的信息,同时服务端可以调用客户端的脚本。SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。

(1)Socket类:主要用于管理连接(将应用程序与端口连接起来,端口是一台计算机的数据都通过此连接网络,
Socket是基于流套接字协议(TCP协议)/基于数据报套接字协议(UDP协议)最为通用的API。),实现Berkeley通信端套接字接口,同时它还定义了绑定、连接网络端点及传输数据所需的各种方法。

 

    1. void Bind(IPEndPoint
      localEP):绑定地址,使Socket与一个本地终节点相关联。
    2. Void Connect(IPEndPoint ip):建立连接
    3. Void Listen(int backlog):将Socket置于侦听状态,
      backlog最多可连接数。
    4. Int Receive(byte[] buffer):接收数据
    5. Int Receive (byte[] buffer,ref IPEndPoint
      ip):从指定地址接收数据
    6. Int Send(byte[] buffer):发送数据
    7. Int Send To(byte[] buffer,ref IPEndPoint
      remoteIP):向指定地址发送数据
    8. Void Shutdown(SocketShutdown
      how):关闭套接字,how指定不在允许执行的操作

SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。

注:使用accept函数建立新的连接时,并不是使用原来的Socket进行通信,而是返回一个新的Socket套接字进行连接通信。原来的Socket继续进入监听状态,等待他人的连接要求。

SignalR的服务端提供了两种实现方式,分别是PersistentConnection和Hub,这两种方式的侧重点不同:

(2)TcpClient类:基于Socket类构建,用于在同步阻止模式下通过网络来连接,发送,接收数据。

  PersistentConnection Hub/生成Proxy模式 Hub/非生成Proxy模式
服务端配置

app.Map("/messageConnection", map => 
           { 
               map.RunSignalR<MessageConnection>(); 
           });

app.Map("/messageHub", map => 
           { 
               map.RunSignalR(new Microsoft.AspNet.SignalR.HubConfiguration { EnableJavaScriptProxies = true }); 
           });

app.Map("/messageHub", map => 
            { 
                map.RunSignalR(new Microsoft.AspNet.SignalR.HubConfiguration { EnableJavaScriptProxies = true }); 
            });

引入js文件 jquery-1.6.4.min.js 
jquery.signalR-2.2.0.min.js
jquery-1.6.4.min.js 
jquery.signalR-2.2.0.min.js 
/messageHub/js 
上述js文件是动态生成,其中messageHub的为服务端定义的路径
jquery-1.6.4.min.js 
jquery.signalR-2.2.0.min.js
创建连接 var connection = $.connection("/message"); var connection = $.connection; var connection = $.hubConnection();
开启连接

connection.start() 
                .done(function () { 
                    connected = true; 
                }) 
                .fail(function () { 
                    alert("连接失败"); 
                });

connection.hub.start() 
                .done(function () { 
                    connected = true; 
                }) 
                .fail(function () { 
                    alert("连接失败"); 
                });

connection.start() 
                .done(function () { 
                    connected = true; 
                }) 
                .fail(function () { 
                    alert("连接失败"); 
                });

代理对象 var proxy = connection.MessageService; 
MessageService是Hub的名称
var proxy = connection.createHubProxy("MessageService"); 
MessageService是Hub的名称
定义客户端方法

proxy.client.hello = function (message) { 
                      console.log(message);   

}

proxy.on("hello", function (message) {        

                  console.log(message);

});

接收消息

connection.received(function (message) { 
                alert(message); 
            });

通过服务器调用客户端方法实现

通过服务器调用客户端方法实现

发送消息 connection.send(message); 通过调用服务端方法实现 
proxy.server.hello(message);
通过调用服务端方法实现 
proxy.invoke("hello", message);
设置QueryString 在创建connection时指定 
var connection = $.connection("/messageConnection", { username: "qs" + username });
connection.hub.qs = { username: "qs" + username }; connection.qs = { username: "qs" + username };
设置Cookie document.cookie = "username=" + username; document.cookie = "username=" + username; document.cookie = "username=" + username;
设置State proxy.state.ClientType = "HubAutoProxy"; proxy.state.ClientType = "HubNonAutoProxy";

       
这是它能够以更高的抽象程度提供TCP服务的基础。体现在网络数据的发送和接受方面,是TcpClient使用NetworkStream网络流处理技术,使得它读写数据更加方便直观。TcpClient类专为客户端设计,它为
TCP 网络服务提供客户端连接。

示例代码下载

(3)NetworkStream网络流:可以被视为一个数据通道,架设在数据来源端(客户Client)和接收端(服务Server)之间,通过TcpClient.GetStream方法,返回用于发送和接收数据的网络流NetworkStream。

 

       
注:要创建NetworkStream必须提供连接的Socket.默认情况下关闭NetworkStream并不会关闭所提供的Socket.如果要关闭Socket权限,则必须将ownsSocket构造函数参数的值指定为true.而后的数据读取及写入均针对这个通道来进行。不支持对网络流的随机访问。

 

示例如下:通过以下方法得到NetworkStream网络流之后,就可以使用标准流读写方法Write和Read来发送和接受数据了。

docs.microsoft t

1 TcpClient tcpClient = new TcpClient();             //创建TcpClient对象实例
2 tcpClient.Connect("www.baidu.com",4088);         //尝试与远程主机相连
3 NetworkStream stream=tcpClient.GetStream();      //获取网络传输流

容易碰到的问题:

  1. BeginRead():从NetworkStream开始一步读取
  2. BeginWrite():开始向流异步写入
  3. Close():关闭NetworkStream
  4. EndRead():处理异步读取结束
  5. EndWrite():处理异步写入结束
  6. Flush():刷新流中的数据
  7. Read():从流中读取
  8. ReadByte():从流中读取一个字节,并将流内的位置向前推进一个字节。到达末尾,返回-1。
  9. Write():将数据写入NetworkStream
  10. WriteByte():将一个字节写入流内的当前位置,并将流内的位置向前推进一个字节。

 

Server:获取基础网络Socket

1.预定义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入:[

发表评论

电子邮件地址不会被公开。 必填项已用*标注