C# 如何同步读/写到流?
您好, 我有C#中的自定义Telnet客户端。我正在使用它与IMAP服务器通信。它的工作原理是只写命令,然后得到响应。测试代码:C# 如何同步读/写到流?,c#,synchronization,telnet,C#,Synchronization,Telnet,您好, 我有C#中的自定义Telnet客户端。我正在使用它与IMAP服务器通信。它的工作原理是只写命令,然后得到响应。测试代码: Telnet tc = new Telnet(); // setup server credentials const string server = "pop.nexlink.net"; const int port = 140; const in
Telnet tc = new Telnet();
// setup server credentials
const string server = "pop.nexlink.net";
const int port = 140;
const int timeout = 70;
// establish server connection
tc.Setup(server, port, timeout);
// test initial server response
Console.WriteLine(tc.output);
// set-up a few commands to send
var array = new[] { "USER AppChecker@nexlink.net", "PASS password", "QUIT" };
// while connected to server
if (tc.IsConnected)
{
foreach (string str in array)
{
// Show command on console
Console.WriteLine(str);
// Write to Stream
tc.WriteLine(str);
// Read from Stream
tc.Read();
// Test the Stream output
Console.Write(tc.output);
}
}
// close connection
tc.Disconnect();
调用上述代码的输出为:
问:如何处理 过去我已经手动编写了自己的telnet客户端。我处理命令的方式是为每个命令编写一个流,其中包含输入和预期的响应(在您的例子中,是我预期的部分回复+OK)。这将允许我发送命令并等待响应。若未收到响应或响应不匹配,则引发异常
Telnet可以为每个命令发送许多响应(空白、页面更改、登录流等)。因此,等待您预期的响应是必要的。我过去已经手动编写了自己的telnet客户端。我处理命令的方式是为每个命令编写一个流,其中包含输入和预期的响应(在您的例子中,是我预期的部分回复+OK)。这将允许我发送命令并等待响应。若未收到响应或响应不匹配,则引发异常
Telnet可以为每个命令发送许多响应(空白、页面更改、登录流等)。因此,等待您预期的响应是必要的。首先,IMAP邮件服务器不会讲Telnet。Telnet是TCP之上的协议。看见然而,Telnet客户端的优点是,由于Telnet是原始TCP套接字之上的一个非常简单的协议,因此,您可以连接到许多在TCP之上使用文本命令/响应样式协议(POP3、IMAP、SMTP、HTTP等)的服务并与之交互 最终,您可能应该使用“现成的IMAP客户机”。做一些随机的谷歌搜索让我找到了。我不知道这是否是好的,但它可能会导致你的快速胜利 然而,如果你想学习如何正确地进行TCP/IP网络,你必须了解双向IO的一些基本原理 你在这里的经历很正常。TCP套接字上有两个通道。一个用于阅读,一个用于写作。这些通道是独立的,并且可能是缓冲的 缓冲意味着,仅仅因为您在客户端代码中向发送套接字写入了一些数据(一行或任何内容),并不意味着它已在另一端被接收 因此,在写入之后立即阻塞读取可能意味着您的命令永远不会被发送,您将永远阻塞读取 此外,您可以以操作系统和带宽允许的速度将命令写入发送套接字。只要服务器开始处理回复,回复就会返回。可能很快,也可能永远不会。socket编程本质上是异步的,并且容易失败(毕竟,您是在通过不可靠的网络处理远程系统) 处理异步双向IO的常用方法是使用两个线程。一个用于阅读,另一个用于写作。当你必须在两个线程之间协调请求和响应的“聊天”时,“乐趣”就开始了。线程原语,如AutoResetEvent和ManualResetEvent,在这里会有所帮助。尽管你可能会尽最大的努力去看这些,因为它们可以使工作简单得多 总的来说,我建议。即使对于SMTP和POP3这样的“简单”协议,编写良好的无错误网络代码也是非常重要的
如果您不想在解决方案中使用C#,而只是想自动化一些简单的Telnet风格的服务交互,那么您应该看看Linux/Unix实用程序,它可以为您节省大量时间。首先,IMAP邮件服务器不讲Telnet。Telnet是TCP之上的协议。看见然而,Telnet客户端的优点是,由于Telnet是原始TCP套接字之上的一个非常简单的协议,因此,您可以连接到许多在TCP之上使用文本命令/响应样式协议(POP3、IMAP、SMTP、HTTP等)的服务并与之交互 最终,您可能应该使用“现成的IMAP客户机”。做一些随机的谷歌搜索让我找到了。我不知道这是否是好的,但它可能会导致你的快速胜利 然而,如果你想学习如何正确地进行TCP/IP网络,你必须了解双向IO的一些基本原理 你在这里的经历很正常。TCP套接字上有两个通道。一个用于阅读,一个用于写作。这些通道是独立的,并且可能是缓冲的 缓冲意味着,仅仅因为您在客户端代码中向发送套接字写入了一些数据(一行或任何内容),并不意味着它已在另一端被接收 因此,在写入之后立即阻塞读取可能意味着您的命令永远不会被发送,您将永远阻塞读取 此外,您可以以操作系统和带宽允许的速度将命令写入发送套接字。只要服务器开始处理回复,回复就会返回。可能很快,也可能永远不会。socket编程本质上是异步的,并且容易失败(毕竟,您是在通过不可靠的网络处理远程系统) 处理异步双向IO的常用方法是使用两个线程。一个用于阅读,另一个用于写作。当你必须在两个线程之间协调请求和响应的“聊天”时,“乐趣”就开始了。线程原语,如AutoResetEvent和ManualResetEvent,在这里会有所帮助。尽管你可能会尽最大的努力去看这些,因为它们可以使工作简单得多 总的来说,我会的