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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...