【问题标题】:TCP client/server with C# .Net带有 C# .Net 的 TCP 客户端/服务器
【发布时间】:2012-12-12 23:44:58
【问题描述】:

我正在关注这个 TCP 客户端/服务器示例

www.codeproject.com/Articles/1415/Introduction-to-TCP-client-server-in-C

我对 WinForms 比对控制台应用程序更熟悉,所以我决定在 WinForms 中重新编写代码。我有相同形式的客户端和服务器代码。初始化服务器时,我使用 AcceptSocket() 后表单被卡住,我无法使用按钮从客户端启动操作。这是否意味着我必须在单独的 WinForms 中编写客户端和服务器? =/

【问题讨论】:

    标签: .net tcp


    【解决方案1】:

    您需要能够在不占用 UI 线程的情况下读取套接字。否则,窗口将显示无响应。

    你有两个选择。第一个,表面上最简单的,是如前所述显式使用线程。

    第二个是使用接受/读/写函数的异步版本之一(BeginXXX/EndXXXXXXAsync,取决于您使用的 API),它为您从线程池启动另一个线程. (Async 版本实际上在事件发生之前不会抓取线程,而 Begin/End 可能会立即抓取一个线程。)除非你真的需要专门为一个新线程监视一个套接字(而且你几乎从不真的),我更喜欢异步的东西。

    无论哪种方式,您都会想了解一些关于多线程的知识。在这种情况下,您需要记住的重要事情是(1)无论您如何做,您的套接字内容几乎肯定会在另一个线程上发生; (2) WinForms控件讨厌被其他线程直接访问;您将需要使用他们的 Invoke 方法来使事情发生在 UI 线程上。

    【讨论】:

    • WinForm 目前确实没有响应。想知道你是怎么知道的? =/
    • @hoangnguyen:主要是反复试验。 :) 我已经看到它发生了。实际上,控制台应用程序也会发生;如果你试图在同一个线程中读写(sans Socket.Select),你最终会看到类似的丑陋。
    【解决方案2】:

    您需要在单独的线程中运行它们。确保您没有阻塞 UI 线程,否则 UI 将变得无响应。

    【讨论】:

    • 这是否意味着我可以在一个表单中运行它们?如果我不熟悉线程,这是否意味着我需要两个表单才能使其更容易? =/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2019-02-26
    相关资源
    最近更新 更多