套接字编程设计问题

时间:2015-11-13 12:12:26

标签: c# sockets architecture

我正在使用C#中的Socket编程(第一次),我正在制作类似Skype的应用程序(视频通话,IM,文件共享,屏幕共享),我有几个问题......

1)套接字应该如何工作?在客户端,我有一个while循环,有效地保持套接字打开,这是正确的吗?或者我应该在每次发送/接收(我使用BeginSend()和BeginRecieve())并创建一个新套接字后关闭套接字?在建立连接后调用interact()。我的代码:

private static void interact()
    {
        try
        {
            while (true)
            {
                receive(client);
                send(client);
            }
        }
        catch (Exception e)
        {
            Logging.errorDisconnect(client, e);
        }
    }

2)如何使用System.Net.Sockets中的BeginSend / BegingRecieve或创建自己的Task实现来设计健壮的客户端/服务器应用程序?

3)对于健壮/可扩展的应用程序,是否有关于客户端/服务器架构的优秀教程?我看过P2P,但我并不完全确定它需要什么。

此外,我正在努力避免第三方实施,这样我就可以了解它是如何完成的。

提前致谢..

1 个答案:

答案 0 :(得分:1)

我假设您想要运行持久连接并偶尔向远程端发送命令。这通常意味着双方必须始终运行读取循环以接收命令。读取和写入之间的交替对于您在此处没有的请求/回复模型是有意义的(因为双方都可以发送请求,并且您可能会错误地将传入的请求用于预期的回复)。

循环不会使套接字保持活动状态。如果你告诉我为什么你认为我可以澄清。您可以独立于任何类型的"循环"。

来决定连接的生命周期

您想要使用哪种呼叫方式(同步,APM,TAP)不会影响套接字的行为方式或线路上的内容。你可以自由选择。套接字很难做到,从同步IO开始。异步IO在这里相当困难,而且可能没必要。

一般来说,你应该尽量避免使用套接字,因为它们很难和低级别。尝试使用一些更高级别的RPC机制,如WCF或HTTP。如果你坚持使用自定义线格,protobuf是一个不错的选择。