using connor_zwcadm.dialog; using connor_zwcadm.model; using connor_zwcadm.util; using System; using System.Collections.Generic; using System.ComponentModel; using System.Net; using System.Net.Sockets; using System.Text; using ZwSoft.ZwCAD.ApplicationServices; using ZwSoft.ZwCAD.DatabaseServices; namespace connor_zwcadm.commands { public class SocketServerCommand { public const int PORT = 11415; // Incoming data from the client. public static string data = null; public const string CLOSE_SOCKET = "CLose"; public const string SUCCESS_MESSAGE = "OK"; public const char REQUEST_SPLITTER = '|'; public const string CMD_SYNC_PROPERTIES = "SYNC"; public const string CMD_CONVERT_PDF = "PDF"; public Dictionary plotInfos = new Dictionary(); private KBackgroundWorker bgWorker { get; } public SocketServerCommand() { bgWorker = new KBackgroundWorker(); bgWorker.backgroundWorker.DoWork += StartServer; } public static void StopServer() { byte[] bytes = new byte[1024]; KUtil.Log("开始关闭Socket服务"); IPAddress ipAddress = IPAddress.Loopback; IPEndPoint remoteEP = new IPEndPoint(ipAddress, PORT); Socket sender = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); sender.Connect(remoteEP); try { byte[] msg = Encoding.UTF8.GetBytes(CLOSE_SOCKET); sender.Send(msg); int bytesRec = sender.Receive(bytes); KUtil.Log("收到返沪数据:" + Encoding.UTF8.GetString(bytes, 0, bytesRec)); } finally { sender.Shutdown(SocketShutdown.Both); sender.Close(); } } public void StartServer(object sender, DoWorkEventArgs e) { KUtil.Log("开始启动Socket服务"); bgWorker.Progress("服务运行中", "", 0); // Data buffer for incoming data. byte[] bytes = new byte[1024]; // Establish the local endpoint for the socket. // Dns.GetHostName returns the name of the // host running the application. //IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipAddress = IPAddress.Any; // ipHostInfo.AddressList[0]; IPEndPoint localEndPoint = new IPEndPoint(ipAddress, PORT); // Create a TCP/IP socket. Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Bind the socket to the local endpoint and // listen for incoming connections. listener.Bind(localEndPoint); listener.Listen(20); // Start listening for connections. while (true) { bgWorker.Progress("服务运行中", "", 0); KUtil.Log("--------------------------------------------------------------------------"); KUtil.Log("等待连接"); // Program is suspended while waiting for an incoming connection. Socket handler = listener.Accept(); try { data = null; // An incoming connection needs to be processed. while (true) { int bytesRec = handler.Receive(bytes); data += Encoding.UTF8.GetString(bytes, 0, bytesRec); if (data.IndexOf("") > -1) { break; } } if (CLOSE_SOCKET.Equals(data)) { handler.Send(Encoding.UTF8.GetBytes("Closed")); handler.Shutdown(SocketShutdown.Both); handler.Close(); break; } bgWorker.Progress("处理请求", "", 30); string resp; KUtil.Log("收到请求:" + data); try { resp = ProcessRequest(data); } catch (Exception ex1) { KUtil.LogErr(ex1); resp = ex1.Message; } KUtil.Log("返回:" + resp); bgWorker.Progress("返回数据", "", 100); // Echo the data back to the client. byte[] msg = Encoding.UTF8.GetBytes(resp); handler.Send(msg); } catch (Exception ex) { KUtil.LogErr(ex); } { try { handler.Shutdown(SocketShutdown.Both); handler.Close(); } catch (Exception ex) { KUtil.LogErr(ex); } } } KUtil.Log("Socket服务已关闭"); } public static Document OpenDoc(string path, bool readOnly) { KUtil.Log("打开:"+path); Document doc = Application.DocumentManager.Open(path, readOnly); Application.DocumentManager.MdiActiveDocument = doc; return doc; } public static void CloseAllDoc() { foreach (Document doc in Application.DocumentManager) { doc.CloseAndDiscard(); } } public static void CloseDoc(Document doc, bool save) { if (doc == null) { return; } KUtil.Log("关闭:"+doc.Name+",保存:"+save); if (save) { doc.CloseAndSave(doc.Name); } else { doc.CloseAndDiscard(); } KUtil.Log("关闭完成"); } public string ProcessRequest(string request) { string[] split = request.Split(REQUEST_SPLITTER); int len = KUtil.GetLen(split); if (len == 0) { return "无请求信息"; } // CloseAllDoc(); string command = split[0].Trim().ToUpper(); string tukuai = null; switch (command) { case CMD_CONVERT_PDF: bgWorker.ProgressDetail("转换PDF"); // 文件路径 标题栏名称 MediaName if (len < 3) { throw new Exception("参数错误"); } bgWorker.pbDialog.Dispatcher.Invoke(new Action(delegate { Document doc = OpenDoc(split[1].Trim(), true); try { using (DocumentLock docLock = doc.LockDocument()) { tukuai = ConvertPDFCommand.ConvertPDF(doc, plotInfos); } } finally { CloseDoc(doc, false); } // 后台打开图纸 //using (Database db = new Database(false, true)) { // db.ReadDwgFile(split[1].Trim(), FileOpenMode.OpenForReadAndAllShare, false, null); // db.CloseInput(true); // ConvertPDFCommand.ConvertPDF(db, split[1].Trim(), plotInfos); // db.Dispose(); //} })); break; case CMD_SYNC_PROPERTIES: bgWorker.ProgressDetail("同步属性"); if (len < 3) { throw new Exception("参数错误"); } bgWorker.pbDialog.Dispatcher.Invoke(new Action(delegate { // 前台打开图纸 Document doc = OpenDoc(split[1].Trim(), false); try { //new ReadInfoCommand().ExecuteCommand(doc); new ReadInfoCommand(split[1].Trim()).Execute(); } finally { CloseDoc(doc, true); } // new ReadInfoCommand(split[1].Trim()).Execute(); // 后台打开图纸 //using (Database db = new Database(false, true)) { // db.ReadDwgFile(split[1].Trim(), FileOpenMode.OpenForReadAndAllShare, false, null); // db.CloseInput(true); // new ReadInfoCommand(split[1].Trim()).Execute(); // // new ReadInfoCommand().ExecuteCommand(db, split[1].Trim()); // //db.SaveAs(split[1].Trim(), DwgVersion.Current); // 不能用这里的保存 // db.Dispose(); //} })); break; default: return "未知命令\""+command+"\""; } if ("OFF".Equals(tukuai)) { return tukuai; } return SUCCESS_MESSAGE; } private void InitCommand() { string[] titleBlockNames = ConfigUtil.GetValue("titles").Split(';'); string[] mediaNames = ConfigUtil.GetValue("media_names").Split(';'); string[] rotates = ConfigUtil.GetValue("rotates").Split(';'); int len = KUtil.GetLen(titleBlockNames); for (int i = 0; i < len; i++) { PlotData plot = PlotData.Parse(i, titleBlockNames, mediaNames, rotates); if (plot == null) { break; } KUtil.Log("添加打印信息: " + plot.TitleBlockName + "|" + plot.MediaName + "|" + plot.Rotate); KUtil.Put(plotInfos, plot.TitleBlockName, plot); } if (plotInfos.Count == 0) { throw new Exception("未配置PDF转换数据"); } } public void ExecuteCommand() { InitCommand(); bgWorker.Start(null); } } }