金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 编程 > path模块常用方法汇总,实现服务端webSocket连接通

path模块常用方法汇总,实现服务端webSocket连接通

发布时间:2019-11-02 02:11编辑:编程浏览(191)

    概要

    书签的设置可以帮助我们快速的定位某段文字,使用起来很方便,也很节省时间。在前一篇文章“C# 如何添加/删除Word书签”中介绍了插入、删除书签的方法,本篇文章将对C# 操作Word书签的功能做进一步介绍。示例内容将包含以下要点:

    • 在现有书签位置插入图片
    • 在现有书签位置插入表格
    • 读取书签位置的文档内容
    • 替换现有书签位置内容

     

    前言

    现阶段socket通信使用TCP、UDP协议,其中TCP协议相对来说比较安全稳定!本文也是来讲解TCP为主(恕在下学艺不精)。      

    下面是个人理解的tcp/ip进行通讯之间的三次握手!

    1.客户端先发送报文到服务端

    2.服务端接受到报文之后进行回复

    3.客户端收到回复之后再次发送确认信息。这个时候才是正式进行连接。

    os.path.abspath(path) #返回绝对路径

    使用工具

    • Spire.Doc for .NET 6.1
    • Visual Studio

    ps:下载安装该类库后,注意添加引用Spire.Doc.dl到项目程序,dll文件可在安装路径的Bin文件夹中获取。

    图片 1

    什么是WebSocket 

    WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

    与传统的HTTP协议对比:

    HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。也就是说HTTP没有办法做到在客户端不请求服务器的情况下主动给客户端发送消息。但是这种情况有时确实我们必须的。当然我们在WebSocket之前我们也是有办法解决的,比如我们使用轮询技术来实现一部分的目的,但是有了WebSocket是必轮询更加合理的解决方案。

    os.path.basename(path) #返回文件名

    示例代码(供参考)

    测试文档如下:

    图片 2

     

     

    WebSocket API介绍

    创建WebSocket 对象,这是所有步骤的第一步。

    var Socket = new WebSocket(url, [protocol] );
    

    os.path.commonprefix(list) #返回list(多个路径)中,所有path共有的最长的路径。

    【示例1】 在现有书签位置插入图片

    步骤 1: 添加using指令

    using Spire.Doc;
    using Spire.Doc.Documents;
    using Spire.Doc.Fields;
    using System.Drawing;
    

    步骤 2 :主要代码段

    //创建实例,加载文档
    Document document = new Document();
    document.LoadFromFile("test.docx");
    
    //实例化BookmarksNavigator类,指定需要添加图片的书签“Bookmark1”
    BookmarksNavigator bn = new BookmarksNavigator(document);
    bn.MoveToBookmark("Bookmark1", true, true);
    
    //添加段落,加载图片并插入到段落
    Section section0 = document.AddSection();
    Paragraph paragraph = section0.AddParagraph();
    Image image = Image.FromFile("img.png");
    DocPicture picture = paragraph.AppendPicture(image);
    bn.InsertParagraph(paragraph);
    document.Sections.Remove(section0);
    
    //保存文档并打开
    string output = "result.docx";
    document.SaveToFile(output, FileFormat.Docx);
    System.Diagnostics.Process.Start(output);
    

    图片插入效果:

     图片 3

    全部代码:

    图片 4图片 5

    using Spire.Doc;
    using Spire.Doc.Documents;
    using Spire.Doc.Fields;
    using System.Drawing;
    
    namespace InsertImgToBookmark_Doc
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建实例,加载文档
                Document document = new Document();
                document.LoadFromFile("test.docx");
    
                //实例化BookmarksNavigator类,指定需要添加图片的书签“Bookmark1”
                BookmarksNavigator bn = new BookmarksNavigator(document);
                bn.MoveToBookmark("Bookmark1", true, true);
    
                //添加段落,加载图片并插入到段落
                Section section0 = document.AddSection();
                Paragraph paragraph = section0.AddParagraph();
                Image image = Image.FromFile("img.png");
                DocPicture picture = paragraph.AppendPicture(image);
                bn.InsertParagraph(paragraph);
                document.Sections.Remove(section0);
    
                //保存文档并打开
                string output = "result.docx";
                document.SaveToFile(output, FileFormat.Docx);
                System.Diagnostics.Process.Start(output);
            }
        }
    }
    

    View Code

     

    WebSocket 对象属性

    Socket.readyState:只读属性 readyState 表示连接状态,可以是以下值:0 - 表示连接尚未建立。1 - 表示连接已建立,可以进行通信。2 - 表示连接正在进行关闭。3 - 表示连接已经关闭或者连接不能打开。

    Socket.bufferedAmount:只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。

    os.path.dirname(path) #返回文件路径

     【示例 2】在现有书签位置插入表格

    步骤 1:添加using指令

    using Spire.Doc;
    using Spire.Doc.Documents;
    using System.Data;
    

    步骤 2 :创建文档,加载文件

    Document doc = new Document();
    doc.LoadFromFile("test.docx");
    

    步骤 3 :创建表格

    //创建Table对象
    Table table = new Table(doc, true);
    
    //创建模拟数据
    DataTable dt = new DataTable();
    dt.Columns.Add("PI", typeof(string));
    dt.Columns.Add("Type", typeof(string));
    dt.Columns.Add("Nov.", typeof(string));
    dt.Columns.Add("YTD", typeof(string));                     
    dt.Rows.Add(new string[] { "PI","Type", "Nov.", "YTD" });
    dt.Rows.Add(new string[] { "1", "BAIC EC-Series", "15.719", "64.910" });
    dt.Rows.Add(new string[] { "2", "Tesla Model S", "3.889", "46.951" });
    dt.Rows.Add(new string[] { "3", "Nissan Leaf", "2.817", "46.423" });
    
    //将数据填充至表格
    table.ResetCells(dt.Rows.Count, dt.Columns.Count);
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        for (int j = 0; j < dt.Columns.Count; j++)
        {
            table.Rows[i].Cells[j].AddParagraph().AppendText(dt.Rows[i][j].ToString());
        }
    }
    

    步骤 4 :插入表格到书签位置

    //获取指定书签位置
    BookmarksNavigator navigator = new BookmarksNavigator(doc);
    navigator.MoveToBookmark("origin2");
    
    //将表格添加至TextBodyPart
    TextBodyPart part = navigator.GetBookmarkContent();
    part.BodyItems.Add(table);
    //替换原有书签内容
    navigator.ReplaceBookmarkContent(part);
    

    步骤 5 :保存文件

    //保存并打开文件
    doc.SaveToFile("output.docx", FileFormat.Docx2013);
    System.Diagnostics.Process.Start("output.docx");
    

     

     表格插入效果:

    图片 6

    全部代码:

    图片 7图片 8

    using Spire.Doc;
    using Spire.Doc.Documents;
    using System.Data;
    
    namespace InsertTableToBookmark_Doc
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建文档,加载文件
                Document doc = new Document();
                doc.LoadFromFile("test.docx");
    
                //创建Table对象
                Table table = new Table(doc, true);
    
                //创建模拟数据
                DataTable dt = new DataTable();
                dt.Columns.Add("PI", typeof(string));
                dt.Columns.Add("Type", typeof(string));
                dt.Columns.Add("Nov.", typeof(string));
                dt.Columns.Add("YTD", typeof(string));                     
                dt.Rows.Add(new string[] { "PI","Type", "Nov.", "YTD" });
                dt.Rows.Add(new string[] { "1", "BAIC EC-Series", "15.719", "64.910" });
                dt.Rows.Add(new string[] { "2", "Tesla Model S", "3.889", "46.951" });
                dt.Rows.Add(new string[] { "3", "Nissan Leaf", "2.817", "46.423" });
    
                //将数据填充至表格
                table.ResetCells(dt.Rows.Count, dt.Columns.Count);
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        table.Rows[i].Cells[j].AddParagraph().AppendText(dt.Rows[i][j].ToString());
                    }
                }
    
                //获取指定书签位置
                BookmarksNavigator navigator = new BookmarksNavigator(doc);
                navigator.MoveToBookmark("origin2");
    
                //将表格添加至TextBodyPart
                TextBodyPart part = navigator.GetBookmarkContent();
                part.BodyItems.Add(table);
    
                //替换书签内容
                navigator.ReplaceBookmarkContent(part);
    
                //保存并打开文件
                doc.SaveToFile("output.docx", FileFormat.Docx2013);
                System.Diagnostics.Process.Start("output.docx");
            }
        }
    }
    

    View Code

     

    WebSocket 事件

    WebSocket 存在基本的的四个事件处理

    Socket.onopen:连接建立时触发

    Socket.onmessage:客户端接受到服务器发送的消息时候触发

    Socket.onerror:通许期间发生错误时触发

    Socket.onclose:连接关闭触发,不管你主动还是被动的

    os.path.exists(path)  #路径存在则返回True,路径损坏返回False

    【示例3】读取书签位置的内容

    步骤 1 :添加using指令

    using Spire.Doc;
    using Spire.Doc.Documents;
    using Spire.Doc.Fields;
    using System;
    

    步骤 2 :获取书签位置的内容

    //初始化BookmarkNavigator类对象
    BookmarksNavigator navigator = new BookmarksNavigator(doc);
    //定位到指定书签位置,获取书签位置的文档内容
    navigator.MoveToBookmark("bookmark1");
    TextBodyPart textBodyPart = navigator.GetBookmarkContent();
    

    步骤 3 :读取书签内容

    //遍历书签内容中的子项目,并将文本信息提取至string类型变量中
    string text = null;
    foreach (var item in textBodyPart.BodyItems)
    {
        if (item is Paragraph)
        {
            foreach (var childObject in (item as Paragraph).ChildObjects)
            {
                if (childObject is TextRange)
                {
                    text += (childObject as TextRange).Text;
                }
            }
        }
    }
    //控制台输出文本
    Console.WriteLine(text);
    Console.ReadLine();
    

     

     读取结果:

    图片 9

    全部代码:

    图片 10图片 11

    using Spire.Doc;
    using Spire.Doc.Documents;
    using Spire.Doc.Fields;
    using System;
    
    namespace GetTextOfBookmark_Doc
    {
        class Program
        {
            static void Main(string[] args)
            {
                //实例化Document类,加载测试文档
                Document doc = new Document();
                doc.LoadFromFile("test.docx");
    
                //初始化BookmarkNavigator类对象
                BookmarksNavigator navigator = new BookmarksNavigator(doc);
                //定位到指定书签位置,获取书签位置的文档内容
                navigator.MoveToBookmark("bookmark1");
                TextBodyPart textBodyPart = navigator.GetBookmarkContent();
    
                //遍历书签内容中的子项目,并将文本信息提取至string类型变量中
                string text = null;
                foreach (var item in textBodyPart.BodyItems)
                {
                    if (item is Paragraph)
                    {
                        foreach (var childObject in (item as Paragraph).ChildObjects)
                        {
                            if (childObject is TextRange)
                            {
                                text += (childObject as TextRange).Text;
                            }
                        }
                    }
                }
                //控制台输出文本
                Console.WriteLine(text);
                Console.ReadLine();
            }
        }
    }
    

    View Code

     

    WebSocket 方法

    Socket.send():发送消息给服务器

    Socket.close():关闭连接,客户端主动关闭。

    os.path.lexists  #路径存在则返回True,路径损坏也返回True

    【示例4】替换现有书签内容

    步骤 1 :添加using指令

    using Spire.Doc;
    using Spire.Doc.Documents;
    using Spire.Doc.Fields;
    

    步骤 2 :加载文档

    Document document = new Document();
    document.LoadFromFile("test.docx");
    

    步骤 3 :添加段落及文字

    Section sec = document.AddSection();//添加section
    sec.AddParagraph().AppendText("Welcome Back, n My Friend!"); //添加段落到section,并添加字符串内容
    

    步骤 4 :获取段落

    //获取段落内容 
    ParagraphBase firstReplacementParagraph = sec.Paragraphs[0].Items.FirstItem as ParagraphBase;
    ParagraphBase lastReplacementParagraph = sec.Paragraphs[sec.Paragraphs.Count - 1].Items.LastItem as ParagraphBase;
    //实例化类TextBodySelection和TextBodyPart
    TextBodySelection selection = new TextBodySelection(firstReplacementParagraph, lastReplacementParagraph);
    TextBodyPart part = new TextBodyPart(selection);
    

    步骤 5 :替换书签内容

    BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document);//实例化BookmarksNavigator类 
    bookmarkNavigator.MoveToBookmark("bookmark1", true, true);//定位到书签“bookmark1”所在段落的位置
    bookmarkNavigator.DeleteBookmarkContent(true);//删除原有书签位置的内容
    bookmarkNavigator.ReplaceBookmarkContent(part, true, true);//用新添加段落的内容替换掉原书签的内容并保留格式
    document.Sections.Remove(sec); //移除section
    

    步骤 6 :保存文档

    //保存文档并打开
    document.SaveToFile("替换书签.docx");
    System.Diagnostics.Process.Start("替换书签.docx");
    

     

    替换效果:

    图片 12

    全部代码:

    图片 13图片 14

    using Spire.Doc;
    using Spire.Doc.Documents;
    using Spire.Doc.Fields;
    
    namespace EditOrReplaceBookmark_Doc
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建Document类实例,加载文档 
                Document document = new Document();
                document.LoadFromFile("test.docx");
    
                Section sec = document.AddSection();//添加section
                sec.AddParagraph().AppendText("Welcome Back, n My Friend!"); //添加段落到section,并添加字符串内容
    
                //获取段落内容 
                ParagraphBase firstReplacementParagraph = sec.Paragraphs[0].Items.FirstItem as ParagraphBase;
                ParagraphBase lastReplacementParagraph = sec.Paragraphs[sec.Paragraphs.Count - 1].Items.LastItem as ParagraphBase;
                //实例化类TextBodySelection和TextBodyPart
                TextBodySelection selection = new TextBodySelection(firstReplacementParagraph, lastReplacementParagraph);
                TextBodyPart part = new TextBodyPart(selection);
    
                BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document);//实例化BookmarksNavigator类 
                bookmarkNavigator.MoveToBookmark("bookmark1", true, true);//定位到书签“bookmark1”所在段落的位置
                bookmarkNavigator.DeleteBookmarkContent(true);//删除原有书签位置的内容
                bookmarkNavigator.ReplaceBookmarkContent(part, true, true);//用新添加段落的内容替换掉原书签的内容并保留格式            
                document.Sections.Remove(sec); //移除section
    
                //保存文档并打开
                document.SaveToFile("替换书签.docx");
                System.Diagnostics.Process.Start("替换书签.docx");
            }
        }
    }
    

    View Code

     

    以上是本次关于C# 操作Word书签功能的补充介绍,如需转载,请注明出处。

    (本文完)

     

    连接形式:

          服务器监听:服务器开启服务之后,就进入了监听客户端连接状态。此时不是指定监听那台客户端那是处于一个等待状态(不是暂停,一直处于网络实时监听),等待客户端找他进行连接。

           客户端连接:客户端对目标服务器发起链接请求,发起请求必须要知道IP以及相应端口号。

           确认链接:这个时候服务端的监听就起作用了,受到客户端的请求后会响应客户端请求,创建socket链接。在这里需要注意链接不是一对一的,服务端会重新对请求客户端创建新的socket服务。所以服务端仍处于监听状态仍可以监听。

    os.path.expanduser(path)  #把path中包含的"~"和"~user"转换成用户目录

    代码示例

    好了以上就是一些基本介绍,主要是为了以下的东西做铺垫,毕竟要实现需要有socket的基础,言归正传。下面开始我们完整的webSocket练习吧!(网上有些使用插件或者类库实现的websocket。但是我们所讲的是以socket为基础的)

    os.path.expandvars(path)  #根据环境变量的值替换path中包含的”$name”和”${name}”

    创建服务器

    别的不多少首先创建socket服务器:

    图片 15图片 16

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Net.Sockets;
     7 using System.Net;
     8 using System.Threading;
     9 using System.Text.RegularExpressions;
    10 using System.Security.Cryptography;
    11 
    12 namespace SocketService
    13 {
    14     class SocketService
    15     {
    16         private static byte[] result = new byte[1024];
    17         private static int myProt = 8885;   //端口  
    18         static Socket serverSocket;  //服务器服务
    19         public void Start()
    20         {
    21             //服务器IP地址  
    22             IPAddress ip = IPAddress.Parse("127.0.0.1");
    23             //socket的构造函数进行服务注册
    24             serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    25             //绑定IP地址:端口  
    26             serverSocket.Bind(new IPEndPoint(ip, myProt));
    27             //设定最多10个排队连接请求 
    28             serverSocket.Listen(10);
    29             Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
    30             //通过Clientsoket发送数据  
    31             Thread myThread = new Thread(ListenClientConnect);
    32             myThread.Start();
    33             Console.ReadLine();
    34         }
    35         /// <summary>  
    36         /// 监听客户端连接  
    37         /// </summary>  
    38         private  void ListenClientConnect()
    39         {
    40             while (true)
    41             {
    42                 Socket clientSocket = serverSocket.Accept();
    43                // clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));
    44                 Thread receiveThread = new Thread(ReceiveMessage);
    45                 receiveThread.Start(clientSocket);
    46             }
    47         }
    48 
    49         /// <summary>  
    50         /// 接收消息  
    51         /// </summary>  
    52         /// <param name="clientSocket"></param>  
    53         private  void ReceiveMessage(object clientSocket)
    54         {
    55             Socket myClientSocket = (Socket)clientSocket;
    56             while (true)
    57             {
    58                 try
    59                 {
    60                     //通过clientSocket接收数据  
    61                     int receiveNumber = myClientSocket.Receive(result);
    62                     //  websocket建立连接的时候,除了TCP连接的三次握手,websocket协议中客户端与服务器想建立连接需要一次额外的握手动作
    63                     string msg = Encoding.UTF8.GetString(result, 0, receiveNumber);
    64                     var buffer = result;
    65                     if (msg.Contains("Sec-WebSocket-Key"))
    66                     {
    67 
    68                         myClientSocket.Send(PackageHandShakeData(buffer, receiveNumber));
    69 
    70                        // return;
    71                     }
    72                     var ss = AnalyzeClientData(result, receiveNumber);
    73                     Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));
    74                 }
    75                 catch (Exception ex)
    76                 {
    77                     Console.WriteLine(ex.Message);
    78                     myClientSocket.Shutdown(SocketShutdown.Both);
    79                     myClientSocket.Close();
    80                     break;
    81                 }
    82             }
    83         }
    84  }
    85 }
    

    View Code

     代码注释我已经写的很详细了!希望你们能看懂(哈哈)!

     看到这里有些聪明的网友可能发现问题了!或者操作过但是没有成功的也看出了不同。没有错,在这里我要说明的一点是有些websocket与socket有点不同的就是他的握手的首次信息以及返回信息是需要特定格式的。

    也就是所谓的响应头域需要特殊处理。在不做相对应的响应处理浏览器会报“握手不成功”的错误!

    参考网址: 

    如果初步同学没有看明白请移至另一篇博客,详细封装了此方法解决此错误。(方便有些同学查找错误找不到解决方法,因为鄙人也是搞了一上午才有幸发现此问题,还望海涵)

    最后我们只需要在主方法进行调用开启服务

    图片 17

    此时服务端代码大功告成!下面我们使用js来进行请求就可以了。

    os.path.getatime(path)  #返回最后一次进入此path的时间。

    客户端

    下面附送html建议代码也可以去w3c查看教程:

    html代码:

        <body>
            <a href="javascript:WebSocketTest()">运行 WebSocket</a>
            <a href="javascript:webSocketClose()">关闭WebSocket</a>
            <div id="look" class="m">
    
            </div>
            <input id="message">
            <a href="javascript:send()">发送消息</a>
        </body>
    

    javascript代码:

    图片 18图片 19

    var ws;
    
    function WebSocketTest() {
        if("WebSocket" in window) {
            alert("您的浏览器支持 WebSocket!");
    
            // 打开一个 web socket
            ws = new WebSocket("ws://127.0.0.1:8885");
    
            ws.onopen = function() {
                // Web Socket 已连接上,使用 send() 方法发送数据
                ws.send("发送数据");
                alert("数据发送中...");
            };
    
            ws.onmessage = function(evt) {
                var received_msg = evt.data;
                document.getElementById("look").html+=received_msg;
                alert("数据已接收...");
            };
    
            ws.onclose = function() {
                // 关闭 websocket
                alert("连接已关闭...");
            };
        } else {
            // 浏览器不支持 WebSocket
            alert("您的浏览器不支持 WebSocket!");
        }
    }
    
    function webSocketClose() {
    ws.close();
    alert("关闭了通讯")
    }
    function send(){
        var msg= document.getElementById("message").value;
        if(msg==""||msg==undefined){
            alert("请填写发送内容!")
            return;
        }
        ws.send("1111111111");
        alert("发送了消息")
    }
    

    View Code

    最后附上运行截图:

    图片 20

     图片 21

    好了以上就是webSocket的一些基础介绍和简单的代码示例。

    下一篇在此基础上完善成一个聊天示例:【WebSocket No.2】WebSocket和Socket实现聊天群发

    os.path.getmtime(path)  #返回在此path下最后一次修改的时间。

    os.path.getctime(path)  #返回path的大小

    本文由金沙国际官网发布于编程,转载请注明出处:path模块常用方法汇总,实现服务端webSocket连接通

    关键词: