array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 客户端和服务端之间的通信(TCP) - 爱码网

和上篇的 客户端和服务端之间的通信(UDP)程序类似:http://www.cnblogs.com/Shang0109/archive/2012/07/29/2614176.html

     Socket最初应用于Unix当中,代表了一种文件描述符(在Unix中一切都是以文件为单位的)。在Windows当中则用于描述网路的访问,程序员通过Socket来发送和接收网路中的信息,因此我们可以把它理解为是一个跟网卡交互的API接口函数。

Socket访问网络的要素:

     1、本机的IP和Port端口(Socket只有与某一个IP和Port绑定,才能偶发挥强大的作用)

     2、必须指定通讯协议如:TCP和UDP。

在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务

通过一个简单的实例来了解一下Socket在TCP协议下的基本通讯。

在程序当中使用到Socket时,需要首先添加“using System.Net; 和using System.Net.Sockets;” 两个引用

一、新建一个控制台应用程序:Server;

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    class Program
    {
        //1、要使用 Socket 发送和接收数据,必须首先使用 AddressFamily、SocketType 及 ProtocolType 创建它
        //2、SocketType 有时会隐式指示在 AddressFamily 中使用哪个 ProtocolType。例如,当 SocketType 为 Dgram 时,ProtocolType 始终为 Udp。
        //   当 SocketType 为 Stream 时,ProtocolType 始终为 Tcp。如果试图使用不兼容的组合创建 Socket,则 Socket 将引发 SocketException。

        static void Main(string[] args)
        {
            //第一步,定义一个Socket套接字
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //SocketType.Stream支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界。此类型的 Socket 与单个对方主机进行通信,并且在通信开始之前需要远程主机连接。Stream 使用传输控制协议 (Tcp) ProtocolType 和 InterNetworkAddressFamily。
            //AddressFamily.InterNetwork表示使用的IP地址是4段的,
            
            //第二步,绑定ip和端口
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
            s.Bind(ipep);
            
            //第三步,通知TCP,服务器已经就绪
            s.Listen(0);//TCP是面向连接的,需要用Listen()方法监听一下网络上是否有人发送东西过来。
            //而UDP则不需要,UDP是无连接的,来者不拒。
            Console.WriteLine("服务器已启动!");

            //第四步,等待客户端的连接请求
            Socket client = s.Accept();
            //TCP情况下,如果监听到一个连接,就可以使用Accept()方法进行接收这个连接,然后执行Send()或者Receive()
            //UDP则不需要Accept(),直接用SendTo/ReceiveFrom来执行操作。
            //UDP不建立连接,所以发送前并不知道对方的IP和端口,因此需要指定一个发送的节点才能进行正常的发送和接收。(参照上篇UDP:http://www.cnblogs.com/Shang0109/archive/2012/07/29/2614176.html
            Console.WriteLine("有客户端:" + client.RemoteEndPoint.ToString() + "连接");
            
            byte[] recv = new byte[1024]; //定义一个byte类型的数组用于接收信息
            //接收客户端的信息,并保存到byte数组中(Receive()使用指定的 SocketFlags,从绑定的 Socket 接收数据,将数据存入接收缓冲区。)
            //SocketFlags:指定套接字的发送和接收行为。None:不对此调用使用标志。
            int bytes = client.Receive(recv, recv.Length, SocketFlags.None);
            //将byte数组转换成可读的string
            string receive = Encoding.ASCII.GetString(recv, 0, bytes);//进接收的信息转换成相应的字符串
            Console.WriteLine("接收到一条信息:" + receive);

            string sendString = "hello,this is a string from server";
            byte[] send = Encoding.ASCII.GetBytes(sendString);
            client.Send(send, send.Length, SocketFlags.None);

            client.Close();
            s.Close();//关闭套接字,服务停止
            Console.ReadLine();
        }
    }
}

二、新建一个控制台应用程序:Client;

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            //客户端和服务端类似
            //第一步:建立套接字
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            
            //第二步:将套接字于远程主机连接
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);//127.0.0.1指定本机的IP地址
            s.Connect(ipep);//连接服务器

            //第三步:发送信息
            string sendString = "this is a string to send";
            byte[] send = Encoding.ASCII.GetBytes(sendString);//将发送的信息转换成byte类型数组
            s.Send(send, send.Length, SocketFlags.None);

            byte[] recv = new byte[1024];
            int length = s.Receive(recv, recv.Length, SocketFlags.None);
            string receive = Encoding.ASCII.GetString(recv, 0, length);
            Console.WriteLine("从服务器端接收到一条信息:" + receive);

            s.Close();
            Console.ReadLine();
        }
    }
}

三、运行:先启动服务器,之后运行客户端程序。

客户端和服务端之间的通信(TCP)

相关文章:

  • 2020-01-02
  • 2019-11-12
  • 2018-05-10
  • 2018-08-25
  • 2021-12-08
  • 2018-09-28
  • 2017-12-09
猜你喜欢
  • 2021-11-07
  • 2018-03-23
  • 2021-11-09
  • 2019-10-26
  • 2019-12-18
  • 2019-11-05
  • 2019-09-05
相关资源
相似解决方案