通过TCP处理客户端/服务器通信 - 一般问题

时间:2011-05-25 17:01:55

标签: c# .net vb.net tcp network-programming

谷歌对我的问题有点棘手,因为它更多的是关于流程的问题,而不是严格的技术问题。

我正在建立一个基本的TCP客户端/服务器系统,我想知道如何在理想情况下进行来回通信。在我的特定情况下,客户端必须提交登录凭据,并从服务器发出特定请求(服务器与远程数据库交互)。

以下是我想要做的事情......而我只是从其他开发者的输入中寻找。

SERVER: Wait for new connections
CLIENT: Connects to server
CLIENT: Once connected, send login credentials with an instruction code.
        i.e. $LOGIN$,username,password
SERVER: Check instruction code, if code = $LOGIN$, try to authenticate
SERVER: If authentication fails, send user message saying login failed
        i.e. $MSG$,101,Login Failed
CLIENT: If instruction code = $MSG$ and if message id = 101, display message and disconnect.

另一种情况......让我们说客户想要请求最近在服务器上发生的事情的日志(控制台应用程序窗口的文本)。

CLIENT: Send request message to server for recent log
        i.e. $REQ$,105
SERVER: If instruction = $REQ$ and request id = 105, get window text and send to client
        i.e. $DATA$,105,<data here>
CLIENT: If instruction = $DATA$ and data id = 105, parse data and display to user

请求的数据可以是纯文本,也可以是转换为XML等的.net数据表。它可以是各种各样的东西。

对此的想法?提示?

谢谢!

1 个答案:

答案 0 :(得分:2)

我强烈建议您通过安全(https)连接使用WCF Data Services。它非常适合以灵活高效的方式通过网络公开数据集,依靠经过验证的ASP.NET身份验证来保证安全。

如果您仍需要基本的TCP / IP,请考虑以下事项:

  • 您需要加密通信(SSL / TLS或类似信息),因为您要传递身份验证信息。
  • 消息的常见结构是“类型,长度,数据”(TLD)。这样可以实现一些向后兼容性,因为接收方可以跳过它无法识别的消息类型。
  • 请记住,TCP / IP不是消息传递协议,而是流协议,因此您需要message framing
  • 您还需要包含detecting half-open connections的条款。
  • 评估防止SQL注入攻击所需的保护级别;通常,将SQL作为文本接收的服务器是个坏主意。

请注意,WCF数据服务(通过HTTPS使用时)会为您处理上述所有内容。