如何使用TcpListener和TcpClient创建双工连接?

4

我有这样一种情况,需要并行发送和接收信息。
我的协议可以定义读端口和写端口。

我目前拥有以下代码:

public void Listen()
{
    ThreadPool.SetMinThreads(50, 50);
    listener.Start();

    while (true)
    {
        var context = new ListeningContext(listener.AcceptTcpClient(), WritePort);
    }
}

我可以从我正在传递的TcpClient创建另一个监听器吗?

2个回答

15
一个 TcpClient 对象包装了一个 NetworkStream 对象。您可以使用 TcpClientGetStream() 方法来访问 NetworkStream 对象,然后用于从网络读取数据和写入数据。MSDN 对 NetworkStream 的文章如下所示:

在 NetworkStream 类的实例上可以同时执行读取和写入操作,而无需同步。只要有一个独特的线程用于写入操作,一个独特的线程用于读取操作,就不会在读取和写入线程之间发生交叉干扰,也不需要进行同步。

使用 TcpListener 对象来侦听传入连接。使用从调用 AcceptTcpClient() 返回的 TcpClient 对象与远程端点通信(读取 写入)。

这就是我在寻找的答案。谢谢你。那么这意味着我不能使用TaskFactory吗?它可能会在同一个线程上运行操作。 - the_drow
长话短说,我如何使用Task API确保读取和写入在不同的线程上运行? - the_drow

4

据我所知,您只能发送或接收数据,因为套接字可能是一个文件,对吧?我找不到它在哪里说它是全双工的。 - the_drow
不,套接字是套接字,文件是文件。 - Nikolai Fetissov
@Nikolai N Fetissov:Linux使用文件描述符来实现套接字。我有什么遗漏的吗? - the_drow
不仅仅是Linux,在任何地方,套接字都表示为文件描述符。但你不能在常规磁盘文件上调用 accept()。内核知道区别。 - Nikolai Fetissov
@Nikolai N Fetissov:我没有说它是普通文件。 它使用硬盘驱动器,对吧? - the_drow
文件描述符是进程打开文件表中的偏移量,该表引用内核文件表,该表包含指向处理例程的函数指针。这些对于每个文件系统、套接字和共享内存段都是不同的。而且,套接字并不使用硬盘,因为那样会使网络传输变得非常缓慢 :) - Nikolai Fetissov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接