【课题】:【基于网络端口通信的客户端应用程序】解决方案【示意程序】
【创建日期】:2007年6月7日星期四
【完成日期】:2007年6月8日星期五
【级别】:Demo示例程序
【关键字】:Socket,TCP/IP,UDP,WinForm,Net,C#
【解决方案说明】:
本解决方案用于描述基于网络端口通信的客户端应用程序解决方案。本示例仅为了展示应用程序如何利用端口进行通信。本解决方案包含两个项目(TcpServerClient,UdpServerClient)分别用于展示TCP/IP协议下的强制连接通信过程和UDP协议下的无连接通信过程。两种过程相互独立,可以根据应用程序的具体使用环境而自由选择。
程序均通过自身接收和发送文本消息。所有消息通过端口进行通信。监听消息的部分均采用单独线程进行工作(多线程),以获得发送消息的自由和不间断的消息监听机制。
TCP/IP协议版本可以在单机开启两个应用程序,但是其中一个将显示异常报告,两个窗体进行的输入将在另外一个单独的正常的窗体中显示。UDP协议版本则不可以在单机开启两个应用程序。但这并不表示应用程序之间无法自由通信,原因是同一应用程序对同一计算机的同一端口进行监听将会出现异常,这部分内容有待完善。
本应用程序可在局域网内自由通信,若通信失败,请先检查是否开启了防火墙拦截了此软件的通信。
【程序截图】:
【程序解读】:
C#:(仅以TCP进行代码讲解,UDP协议的基本思路相同)
1
2
3
4
5
6
7
8
9
| 注意:以上程序并非线程安全的,如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。(本程序在XP、2003下运行均通过,TCP版同样能在Vista版本下通过,而UDP版则在Vista下因为线程安全的问题报错。) 解决方案1:判断窗体InvokeRequired,如果值为true则利用委托进行调用。 解决方案2:使用 BackgroundWorker 进行的线程安全调用(可以在工具箱中找到该控件) |
2
3
【免责声明】:
本解决方案只为示意如何进行简单的Socket编程,程序中可能存在有明显的未修复BUG,不影响示意程序的正常表达,可能未作修复。如同一计算机开启两个相同窗体可能引发的异常等。
【欢迎交流】:
与本示意有关的任何问题,请与我取得联系,我将积极为您解答。