如何处理对同一个套接字的读取和写入

本文关键字:套接字 读取 同一个 何处理 处理 | 更新日期: 2023-09-27 17:51:06

我与套接字服务器建立连接,然后开始大量读写数据。立即出现异常:

系统类型的异常。InvalidOperationException'在mscorlib.dll中发生,但未在用户代码中处理

附加信息:流当前正在被前一个操作所使用。

如何检测

_reader.ReadLineAsync();

目前正在接收一些数据,我应该等待写入,反之亦然?

这个类由客户端使用,它基本上将从服务器接收到的数据发送回服务器。

public class TcpClientWorker2 
{
    private TcpClient _client;
    private Thread _t;
    private NetworkStream _networkStream;
    private StreamWriter _writer;
    private StreamReader _reader;
    public TcpClientWorker2()
    {
        var ipHostInfo = Dns.Resolve(Dns.GetHostName());
        var ipAddress = ipHostInfo.AddressList[0];
        _client = new TcpClient();
        _client.Connect(ipAddress, 10000);
        _t = new Thread(Run);
    }
    public async void Run()
    {
        _networkStream = _client.GetStream();
        _reader = new StreamReader(_networkStream);
        _writer = new StreamWriter(_networkStream) { AutoFlush = true };
        while (true)
        {
            var data = await _reader.ReadLineAsync();
            //perform callback (send the data immediately back to server)
        }
    }
    public void Start()
    {
        _t.Start();
    }
    public async Task Send(string text)
    {
        await _writer.WriteLineAsync(text);
    }
}

如何处理对同一个套接字的读取和写入

从这个来源你得到确认:https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream%28v=vs.110%29.aspx?f=255& MSPPError = -2147217396

读写操作可以在NetworkStream类的一个实例上同时执行,而不需要同步。只要有一个唯一的线程执行写操作和一个唯一的线程执行读操作,读和写线程之间就不会交叉干扰,也不需要同步。

我们可以在你的代码中看到只有一个线程在读取,但是在你的代码中没有确认只有一个线程在写。