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 是一个不错的选择。
我正在(第一次)使用 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 是一个不错的选择。