2012-05-22 26 views
3

我在大堂设置了一个视频亭,它可以让人登记并打印带有照片,名字等的徽章。还有一个远程支持工具,有时会不幸崩溃。我在自助服务终端上有一个解决此问题的功能,但您必须立即前往自助服务终端触发它。如何通过网络在两个WinForm应用程序之间调用函数?

我还编写了一个管理工具,使用WMI监视和管理信息亭的其他方面。我希望能够通过此应用程序触发此修复功能。我花了无数小时在谷歌试图找出这没有运气。也许我不是在寻找正确的东西。

我的问题是这样的。在C#中,如何通过网络从管理应用程序调用我的自助服务终端应用程序中的修复功能?

+0

我没有你想要的答案。但是当地的售货亭上的计时器呢,每隔一段时间尝试修理...... 5分钟...... 3分钟......或任何你需要的东西。或者远程桌面怎么样,在哪里控制第二台计算机。 –

+1

我认为RMI或WCF可能是你正在寻找的东西:http://stackoverflow.com/questions/1830243/c-sharp-remote-method-invocation-rmi **和** http:// stackoverflow。 com/questions/3560107 /远程方法调用的什么网络标准 – Kiril

+1

我认为TCP/IP连接对此很有好处。您的管理应用程序将是服务器(侦听消息),您的信息亭会向其发送消息。如果你想了解更多,我可以提供一个基本的例子。 – jp2code

回答

2

好吧,在我的Server表格中,我有一个BackgroundWorker,它运行一个TcpListener。你会想把这个TcpListener放在BackgroundWorker中,否则你将永远无法停止它的执行直到它接受一个TcpClient。

此外,你将要处理您在执行主线程这个后台线程接收到任何数据,以防止交叉线异常:

private TcpListener _listener; 
private const int port = 8000; 

private void Worker_TcpListener(object sender, DoWorkEventArgs e) { 
    BackgroundWorker worker = sender as BackgroundWorker; 
    do { 
    try { 
     _listener = new TcpListener(IPAddress.Any, port); 
     _listener.Start(); 
     TcpClient client = _listener.AcceptTcpClient(); // waits until data is avaiable 
     int MAX = client.ReceiveBufferSize; 
     NetworkStream stream = client.GetStream(); 
     Byte[] buffer = new Byte[MAX]; 
     int len = stream.Read(buffer, 0, MAX); 
     if (0 < len) { 
     string data = Encoding.UTF8.GetString(buffer); 
     worker.ReportProgress(len, data.Substring(0, len)); 
     } 
     stream.Close(); 
     client.Close(); 
    } catch (SocketException) { 
     // See MSDN: Windows Sockets V2 API Error Code Doc for details of error code 
    } catch (ThreadAbortException) { // If I have to call Abort on this thread 
     return; 
    } finally { 
     _listener.Stop(); 
    } 
    } while (!worker.CancellationPending); 
} 

这将不利于大的消息(如JPEG文件等等),但是对于我用特殊数据编码寻找的短字符串很适用。

该数据被发送回,其中数据被处理执行的我的主线程(使用ReportProcess法):

private void Worker_TcpListener(object sender, ProgressChangedEventArgs e) { 
    if (e.UserState != null) { 
    int len = e.ProgressPercentage; 
    string data = e.UserState.ToString(); 
    if (!String.IsNullOrEmpty(data) && (3 < len)) { 
     string head = data.Substring(0, 3); 
     string item = data.Substring(3); 
     if (!String.IsNullOrEmpty(item)) { 
     if (head == "BP:") { 
      string[] split = data.Split(';'); 
      if (2 < split.Length) { 
      string box = split[0].Substring(3); // Box Number 
      string qty = split[1].Substring(2); // Quantity 
      string customer = split[2].Substring(2); // Customer Name 
      MyRoutine(box, qty, customer); 
      } 
     } 
     } 
    } 
    } 
} 

上面刚刚所述的代码位于和运行长整天。

同时,我的工厂中有大约10台可随时发送数据的Pocket PC设备。对他们来说,代码是用VB写的,我真希望我有时间来完成我的C#版本的这些天,但在这里它是:

Private Sub SendToServer(string serialNum, int qty, string customer) 
    Cursor.Current = Cursors.WaitCursor 
    Try 
    Dim strPacket As String = String.Format("BP:{0};Q:{1};C:{2};", serialNum, qty, customer) 
    Dim colon As Integer = p7_txtIPAddress.Text.IndexOf(":") 
    Dim host As String = p7_txtIPAddress.Text.Substring(0, colon) 
    Dim port As Integer = CInt(p7_txtIPAddress.Text.Substring(colon + 1)) 
    Dim dataPacket As [Byte]() = Encoding.ASCII.GetBytes(strPacket) 
    Using client As New TcpClient(host, port) 
     Dim stream As NetworkStream = client.GetStream() 
     stream.Write(dataPacket, 0, dataPacket.Length) 
    End Using 
    Catch err As Exception 
    MessageBox.Show(err.Message, "Print To Server TCP Error") 
    Finally 
    Cursor.Current = Cursors.Default 
    End Try 
End Function 

我不知道这是否是你想什么要做,但它工作并且可靠。

很明显,我在生产中的代码更大,并且包含了其他一些您不觉得有用的东西(例如,员工验证,错误记录器等)。我已经削减了很多,我希望我没有削减任何必要的东西。

这应该给你一个如何前进的想法,至少。

+0

为了处理图像文件(比如你的信息亭需要的),我建议将它们保存到网络上的已知位置(即“Z:\ kiosk \ images”),然后将图像名称发送到TcpClient(“IMG0001.JPG”)。 – jp2code

相关问题