AutoCAD.net支持後臺線程-Socket通訊

来源:http://www.cnblogs.com/he-xiang/archive/2017/11/24/7890488.html
-Advertisement-
Play Games

1 class Program 2 { 3 private static byte[] result = new byte[1024]; 4 static void Main(string[] args) 5 { 6 //設定伺服器IP地址 7 IPAddress ip = IPAddress.Pa ...


最近因為公司項目的需求,CAD作為服務端在伺服器中常駐運行,等待客戶端遠程發送執行任務的指令,最終確認用Socket-tcp通訊,CAD需要實時監聽客戶端發送的消息,這時就需要開啟線程執行Socket的監聽任務。 這樣問題就來了,CADAPI不支持多線程,您只能從主線程調用API函數,如果您處於不同的線程,則必須將調用集中到主線程上。 最後查了半天的資料發現,最簡單的實現方式,是建立在主線程system.windows.forms.control對象並調用它的啟動功能,做最後處理invoke()功能。 下麵分別是客戶端和服務端的demo
 1  class Program
 2     {
 3         private static byte[] result = new byte[1024];
 4         static void Main(string[] args)
 5         {
 6             //設定伺服器IP地址
 7             IPAddress ip = IPAddress.Parse("10.19.10.237");
 8             //IPAddress ip = IPAddress.Parse("127.0.0.1");
 9             Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
10             try
11             {
12                 clientSocket.Connect(new IPEndPoint(ip, 8885)); //配置伺服器IP與埠
13                 Console.WriteLine("連接伺服器成功");
14             }
15             catch
16             {
17                 Console.WriteLine("連接伺服器失敗,請按回車鍵退出!");
18                 return;
19             }
20             //通過clientSocket接收數據
21             int receiveLength = clientSocket.Receive(result);
22             Console.WriteLine("接收伺服器消息:{0}", Encoding.UTF8.GetString(result, 0, receiveLength));
23             //通過 clientSocket 發送數據
24             for (int i = 0; i < 13; i++)
25             {
26                 try
27                 {
28                     Thread.Sleep(1000);    //等待1秒鐘
29                     string sendMessage = "C:\\Users\\Administrator\\Desktop\\原始CAD文件\\14412-kujiale.dxf";
30                     clientSocket.Send(Encoding.UTF8.GetBytes(sendMessage));
31                     Console.WriteLine("向伺服器發送消息:{0}" + sendMessage);
32                     receiveLength = clientSocket.Receive(result);
33                     Console.WriteLine("接收伺服器消息:{0}", Encoding.UTF8.GetString(result, 0, receiveLength));
34                 }
35                 catch
36                 {
37                     clientSocket.Shutdown(SocketShutdown.Both);
38                     clientSocket.Close();
39                     break;
40                 }
41             }
42             clientSocket.Shutdown(SocketShutdown.Both);
43             clientSocket.Close();
44             Console.WriteLine("發送完畢,按回車鍵退出");
45             Console.ReadLine();
46         }
47     }
Socket客戶端-控制台測試

 

  1  public class SocketServer
  2     {
  3         //通過winform控制項進行後臺處理,CADAPI不支持多線程
  4         static Control syncCtrl;
  5         //承載接收數據
  6         private static byte[] result = new byte[1024];
  7         //
  8         private static int myProt = 8885;
  9 
 10         private static Socket serverSocket;
 11 
 12         delegate void FinishedProcessingDelegate();
 13         public static void InitSocket()
 14         {
 15             //創建控制項
 16             syncCtrl = new Control();
 17             syncCtrl.CreateControl();
 18             //創建通訊對象
 19             serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 20             //綁定IP地址:埠
 21             serverSocket.Bind(new IPEndPoint(IPAddress.Any, myProt));
 22             //設定最多10個排隊連接請求
 23             serverSocket.Listen(10);   
 24             //通過Clientsoket發送數據
 25             Thread myThread = new Thread(ListenClientConnect);
 26             myThread.Start();
 27         }
 28         /// <summary>
 29         /// 監聽客戶端連接
 30         /// </summary>
 31         private static void ListenClientConnect()
 32         {
 33             while (true)
 34             {
 35                 Socket clientSocket = serverSocket.Accept();
 36                 try
 37                 {
 38                     
 39                     clientSocket.Send(Encoding.UTF8.GetBytes("我是牛魔王"));
 40                     Thread receiveThread = new Thread(ReceiveMessage);
 41                     receiveThread.Start(clientSocket);
 42                 }
 43                 catch (Exception)
 44                 {
 45 
 46                     clientSocket.Shutdown(SocketShutdown.Both);
 47                     clientSocket.Close();
 48                 }
 49               
 50             }
 51         }
 52 
 53         /// <summary>
 54         /// 接收消息
 55         /// </summary>
 56         /// <param name="clientSocket"></param>
 57         private static void ReceiveMessage(object clientSocket)
 58         {
 59             Socket myClientSocket = (Socket)clientSocket;
 60             while (true)
 61             {
 62                 try
 63                 {
 64                     //通過clientSocket接收數據
 65                     int receiveNumber = myClientSocket.Receive(result);
 66                     if (receiveNumber>0)
 67                     {
 68                         //獲取文件名稱
 69                         string filePath = Encoding.UTF8.GetString(result, 0, receiveNumber);
 70                         //判斷文件是否存在
 71                         if (FileOperate.FileExists(filePath))
 72                         {
 73                             FileStandardization.filePathByJava = filePath;
 74                             if (syncCtrl.InvokeRequired)
 75                             {
 76                                 //開始執行CAD數據處理的任務
 77                                 syncCtrl.Invoke(new FinishedProcessingDelegate(FileStandardization.TransMianByJava));
 78                             }
 79                             myClientSocket.Send(Encoding.UTF8.GetBytes("我是牛魔王:處理結果是" + FileStandardization.resultJava));
 80                             FileOperate.Log(SystemData.logPath, "我是牛魔王,文件處理完成:" + filePath);
 81                         }
 82                         else
 83                         {
 84                             myClientSocket.Send(Encoding.UTF8.GetBytes("我是牛魔王:文件不存在"));
 85                         }
 86                     }
 87                     else
 88                     {
 89                         FileOperate.Log(SystemData.logPath, "沒有收到數據了");
 90                         myClientSocket.Shutdown(SocketShutdown.Both);
 91                         myClientSocket.Close();
 92                         break;
 93                     }
 94                    
 95                    
 96                 }
 97                 catch (Exception ex)
 98                 {
 99                     FileOperate.Log(SystemData.logPath,"文件處理異常:"+ex.Message);
100                     myClientSocket.Shutdown(SocketShutdown.Both);
101                     myClientSocket.Close();
102                     break;
103                 }
104             }
105         }
106 
107     }
Socket服務端

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 恢復內容開始 Session共用是分散式架構設計中的一大難點,儘管session共用的解決方案不少,但是.net 下的解決方案還是比較少,而且說明文檔也很少。 之前嘗試用memcached緩存session,以解決session共用問題,後來發現實在是沒有解決方案,github上有一個Memcach ...
  • 在博客園也很多年了,一直未曾分享過什麼東西,也沒有寫過博客,但自己也是汲取著博客園的知識成長的; 這兩天想著不能這麼無私,最近.NET CORE貌似挺流行的,閑來無事也自己搞了個asp.net core signalr 博客園裡面也有人在.net core 2.0下麵集成了signalr,但是是集成 ...
  • PS: 第一次用Repeater控制項 記錄一下 請忽略我的命名不規範 請忽略我的最終效果圖(太醜了) 需要用到的朋友可以自行調整的漂亮點 最終效果圖 HTML 後臺代碼 批註:分頁主要實現在於sql語句上 ...
  • 在net framework 4.0中微軟又提供了一個新的非同步操作的功能,叫做任務並行庫(TPL)。任務並行庫的核心是任務(task)。一個任務代表了一個非同步操作,譔操作可以通過多種方式運行,可以使用或不使用獨立的線程。 一個任務(Task)可以通過多種方式和其他任務組合起來使用。... ...
  • 背水一戰 Windows 10 之 控制項(控制項基類 - FrameworkElement): 基礎知識, 相關事件, HorizontalAlignment 和 VerticalAlignment ...
  • case Acad::eOk:lstrcpy(Glb_AcadErrorInfo,_T("正確"));break;case Acad::eNotImplementedYet:lstrcpy(Glb_AcadErrorInfo,_T("尚未實現"));break;case Acad::eNotAppl ...
  • 調用列印程式“PublishToWeb JPG.pc3”進行圖片列印,該列印驅動程式中內置了很多的列印方案,在同尺寸的列印方案下,數據範圍越大列印出來的清晰度就越差,內置的尺寸不一定都滿足,在又要通過我們的插件去完成列印任務,又不能讓客戶總是做配置的情況下,我總結了一個不是很完美的解決方案,實現思路 ...
  • 自從出現了泛型和LINQ,對於集合的排序變得更簡單了。 //倒序 list.OrderByDescending(p=> p.a).ThenByDescending(p => p.b); //多個欄位順序排序 list.OrderBy(i => i.a).ThenBy(i => i.b); ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...