我正在使用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,但我并不完全确定它需要什么。
此外,我正在努力避免第三方实施,这样我就可以了解它是如何完成的。
提前致谢..
答案 0 :(得分:1)
我假设您想要运行持久连接并偶尔向远程端发送命令。这通常意味着双方必须始终运行读取循环以接收命令。读取和写入之间的交替对于您在此处没有的请求/回复模型是有意义的(因为双方都可以发送请求,并且您可能会错误地将传入的请求用于预期的回复)。
循环不会使套接字保持活动状态。如果你告诉我为什么你认为我可以澄清。您可以独立于任何类型的"循环"。
来决定连接的生命周期您想要使用哪种呼叫方式(同步,APM,TAP)不会影响套接字的行为方式或线路上的内容。你可以自由选择。套接字很难做到,从同步IO开始。异步IO在这里相当困难,而且可能没必要。
一般来说,你应该尽量避免使用套接字,因为它们很难和低级别。尝试使用一些更高级别的RPC机制,如WCF或HTTP。如果你坚持使用自定义线格,protobuf是一个不错的选择。