如何处理对同一个套接字的读取和写入
本文关键字:套接字 读取 同一个 何处理 处理 | 更新日期: 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类的一个实例上同时执行,而不需要同步。只要有一个唯一的线程执行写操作和一个唯一的线程执行读操作,读和写线程之间就不会交叉干扰,也不需要同步。
我们可以在你的代码中看到只有一个线程在读取,但是在你的代码中没有确认只有一个线程在写。