Давайте посмотрим на ваш код прослушивания TcpClient. Когда вы звоните stream.Read()
, вы не можете быть уверены, сколько данных будет прочитано из вашего сокета, поэтому вы должны читать до конца потока, или вы должны знать, какую дату вы должны прочитать из сокета. Допустим, вы знаете, сколько данных вы должны прочитать
var readSofar = 0;
var iNeedToRead = 500;//500Bytes
try{
while(readSoFar<iNeedToRead){
var readFromSocket = clientStream.Read(buffer.ReadBuffer, readSofar, readBufferSize-readSofar);
if(readFromSocket==0){
//Remote server ended your connection or timed out etc
//Do your error handling may be stop reading
}
readSofar += readFromSocket;
}
}
catch {
//A socket error has occurred
MessageBox.Show("A socket error has occurred);
break;
}
if (OnDataReceived != null){
// display string to a textbox on the UI
}
Вы можете использовать нулевой оператор распространения, как этот.
OnDataReceived?.Invoke(buffer.ReadBuffer, bytesRead);
Если вы используете WindowsForm, каждый контроллер должен обновляться из потока пользовательского интерфейса, поэтому вы должны вызывать метод подписчика
private void IReceivedData(byte[] data, int count){
this.Invoke(()=>{...Your code});
}