Socket编程设计题

Socket Programming design questions

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

1) 套接字应该如何真正工作?在客户端,我有一个 while 循环,它有效地保持套接字打开,这是正确的吗?或者我应该在每个 Send/Recieve 之后关闭套接字(我正在使用 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 或创建您自己的任务实现来设计稳健的 client/server 应用程序?

3) robust/scaleable 应用程序的 Client/Server 架构是否有任何好的教程?我看过 P2P,但我不完全确定它是我需要的。

另外,我试图避免第 3 方实施,这样我就可以自己了解它是如何完成的..

提前致谢..

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

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

来决定连接的生命周期

您要使用哪种调用方式(同步、APM、TAP)不会影响套接字的行为方式或通过网络传输的内容。你可以自由选择。套接字很难做到正确,从同步 IO 开始。异步 IO 相当困难,在这里可能是不必要的。

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