在单独的线程中读/写TcpClient / SslStream

时间:2017-05-07 10:48:47

标签: c# multithreading sslstream

我与服务器建立了SSL连接并向其发布请求。发布消息的行为应该是即时的,没有延迟来阅读响应,因为会有一些后续帖子应该没有延迟。

这就是我做的原因

        this.sslStream.Write(byteArray, 0, byteArray.Length);

但是,我需要一些响应来实际收到我的应用程序,所以我有一个并行线程:

        this.threadReadStream = new Thread(new ThreadStart(this.ThreadReadStream));
        this.threadReadStream.Start();

在该线程中,我有一个从sslStream读取数据的循环:

    public void ThreadReadStream()
    {
        int bufferLen = 4096, byteCount, pos, pos2;
        var buffer = new byte[bufferLen];
        string responseBuffer = "", responsePart, response = "";
        bool err = true;

        while (true)
        {
            err = true;
            byteCount = 0;
            while (err)
            {
                err = false;
                byteCount = 0;
                try
                {
                    byteCount = this.sslStream.Read(buffer, 0, bufferLen);
                }
                catch (Exception exception)
                {
                    err = true;
                    this.TcpConnect();
                }
            }
            if (byteCount > 0)
            {
                 // do something
            }
        } 
    }

问题是sslStream.Read在单独的线程中使用时总是返回0,但如果在sslStream.Write的同一个线程中调用,则工作正常。

很少有关于不太可能影响问题的事情的评论,但是,最好澄清一下这些事情: 1)我使用while(err)循环来检查连接是否断开。如果是这样,我重新连接并再次阅读。 2)对于那些不喜欢(真实)事物的人。是的,我在并行线程的循环中有退出条件,它关闭了所有与tcp相关的线程。

1 个答案:

答案 0 :(得分:0)

服务器如何识别写入过程已结束? 也许实际上有一条数据通往服务器,所以它不会开始发送响应。 此外,在不同线程之间共享TCP连接不是一个好习惯。