Я пытаюсь передать пользовательский class
от одного клиента tcp к другому (используя TcpListener
, TcpClient
и XmlSerializer
).XmlSerializer и NetworkStream с сервером Tcp - клиент
У меня есть 1 проблема, которая разбивается на 2 проблемы.
, когда я использую этот код, клиент зависает при Serilization делается (я думаю, что другая сторона не знает, когда данные полностью пересылаются):
public void SendData(myMessage messageClass)
{
NetworkStream serverStream = tcpServer.GetStream();
XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage));
xmlSrlz.Serialize(serverStream, messageClass);
serverStream.Flush();
}
public myMessage ReadData()
{
while (true)
{
NetworkStream clientStream = client.GetStream();
XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage));
int bytesToread;
byte[] inStream = new byte[10025];
myMessage msg;
do
{
msg = (myMessage)xmlSrlz.Deserialize(clientStream);
clientStream.Flush();
}
while (((bytesToread = clientStream.Read(inStream, 0, (int)client.ReceiveBufferSize)) > 0));
return msg;
}
}
Так что, когда я искал вокруг я заметил, что я могу распоряжаться поток (или использовать using
) и таким образом пусть другая сторона знает, что данные полностью отправлен и Тереза больше нет данных для отправки:
public void SendData(myMessage messageClass)
{
using (NetworkStream serverStream = tcpServer.GetStream())
{
XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage));
xmlSrlz.Serialize(serverStream, messageClass);
serverStream.Flush();
}
}
public myMessage ReadData()
{
while (true)
{
using (NetworkStream clientStream = client.GetStream())
{
XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage));
int bytesToread;
byte[] inStream = new byte[10025];
myMessage msg;
do
{
msg = (myMessage)xmlSrlz.Deserialize(clientStream);
clientStream.Flush();
}
while (((bytesToread = clientStream.Read(inStream, 0, (int)client.ReceiveBufferSize)) > 0));
return msg;
}
}
}
Но теперь я потерял связь из них 2 клиентов.
, когда я пытаюсь отправить другое сообщение я получаю исключение:
Операция не допускается на несвязных сокетов.
Так как я могу послать Serilized объекта без нарушениясоединения?