Помогите. NetworkStream. SoapFormatter.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Помогите. NetworkStream. SoapFormatter.

Сообщение Fedorfx » 20.10.2005 (Чт) 0:57

Замучился совсем.
Клиент.
Код: Выделить всё

        Client = New TcpClient
        Dim formatter As New SoapFormatter()
        Dim q As MyCls.cls_Enum.s_QUOTE
        Client.Connect(IPAddress.Parse("192.168.0.2"), 3333)
        Dim stream As NetworkStream = Client.GetStream
        formatter.Serialize(stream, q)



Собственно соединение с сервером проходит нормально.
Для каждого соединения создается экземляр вот этого класса.
Код: Выделить всё


Public Class cls_Tcp_Client
    Public Client As TcpClient
    Public Id As String
    Dim rb(2048 * 20) As Byte
    Dim stream As NetworkStream
    Dim ms As New MemoryStream
    Public Sub New(ByVal nId As String, ByVal nClient As TcpClient)
        Try
            Id = nId
            Client = nClient
            stream = Client.GetStream
            stream.BeginRead(rb, 0, rb.Length, New AsyncCallback(AddressOf Me.Recive), Nothing)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
    Sub Recive(ByVal ar As IAsyncResult)
        Dim q As MyCls.cls_Enum.s_QUOTE
        Dim formatter As New SoapFormatter
        Dim i As Integer
        Try
            i = stream.EndRead(ar)
            If i < 1 Then Return
            If stream.DataAvailable Then
                ms.Write(rb, 0, i)
                stream.BeginRead(rb, 0, rb.Length, New AsyncCallback(AddressOf Me.Recive), Nothing)
                Return
            Else
                ms.Write(rb, 0, i)
                ms.Seek(0, SeekOrigin.Begin)
            End If
            q = DirectCast(formatter.Deserialize(ms), MyCls.cls_Enum.s_QUOTE)
            stream.BeginRead(rb, 0, rb.Length, New AsyncCallback(AddressOf Me.Recive), Nothing)
        Catch ex As Exception
            MsgBox(Me.Id.ToString & ex.ToString)
        End Try
    End Sub
End Class




Проблемма.
Иногда работатею Иногда нет.
Выскакивает еррор


"System.Xml.XmlException: Unexpected end of file has occurred. The following elements are not closed: Line 1, position 366.
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.ThrowUnclosedElements()
at System.Xml.XmlTextReaderImpl.ParseAttributes()
at System.Xml.XmlTextReaderImpl.ParseElement()
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Runtime.Serialization.Formatters.Soap.SoapParser.ParseXml()
at System.Runtime.Serialization.Formatters.Soap.SoapParser.Run()
at System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler handler, ISerParser serParser)
at System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream, HeaderHandler handler)
at System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream)
at MyCls.cls_Tcp_Client.Recive(IAsyncResult ar) in C:\SATI\Code\Net\MC\MC\TCP\cls_Tcp_Client.vb:line 36"



Даже не знаю что делать.
Вторая ночь.
Собственно задача.
Создать клиент сервер для обмена обьектами.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 1:01

Видать, не всё пришло ещё, а десериализация запустилась?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 20.10.2005 (Чт) 1:03

Дык
If stream.DataAvailable Then
.....
return

И что тогда делать?

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 20.10.2005 (Чт) 1:50

Вот что откопал.
Когда выскакивает ошибка то тушка soap имеет лишний символ '>'
Вот так
> ;-----Вот этого символа быть не должно.
<SOAP-ENV:Body>

А откуда он появляется я ума не приложу.

Каждый раз создается новый клиент( пока хоть так пытаюсь заставить работать) и остатков там быть не может.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 20.10.2005 (Чт) 2:15

Ночь длинная - открытия одно за другим.
Я так понимаю что у меня в начале каждого пакета проставляется длинна.
Как установил.
Код: Выделить всё

       Client = New TcpClient
        Client.Connect(IPAddress.Parse("192.168.0.2"), 3333)
        Dim stream As NetworkStream = Client.GetStream
        Dim w As New IO.BinaryWriter(stream)
        dat = "1234"
        Debug.Print(dat.Length & vbCrLf & dat)
        w.Write(dat)
        w.Flush()


На входе получаю
Мои 4 байта и перед ними байт с &H4

Охренеть.
Что делать?
Весь код вверху.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 11:44

Использовать не binarywriter? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 20.10.2005 (Чт) 12:33

Варианты?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 12:38

streamwriter? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 20.10.2005 (Чт) 12:49

Пойду учить матчасть.
На всякий случай проверю наличие NetworkStreamWriter or WinSockWriter

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 20.10.2005 (Чт) 12:49

Remoting?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 20.10.2005 (Чт) 13:03

Ремотинг не прокатывает.
Спасибо за тот пример но мне нужен другой движек.
У ремотинга есть свои заморочки.

Мне нужен клиент сервер ( клиентов <5) для рассылки им ByVal обьектов.
Как же я зае........я Давноб свой протокол передачи написалбы точно. Но все пытаюсь по науке. Серилизация мать ее. Форматтеры .. и их тудаже.
Помогите кто чем может пожалуйста.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 20.10.2005 (Чт) 13:10

Fedorfx писал(а):Ремотинг не прокатывает.


чем? в твоём случае, то что надо...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 20.10.2005 (Чт) 13:11

GSerg писал(а):streamwriter? :roll:


Этот writer отсылает как надо. Но SoapFormatter видимо не может востановить обьект без этих байтов которые указывают длинну пакета.
Замкнутый круг.
:(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 13:13

Тогда либо признать, что всё пишется правильно и ошибка в другом, либо использовать при приёме streamreader для прочтения...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 20.10.2005 (Чт) 13:17

Sebas писал(а):
Fedorfx писал(а):Ремотинг не прокатывает.


чем? в твоём случае, то что надо...


Sebas там вот какая фишка.
Есть прога. Принимает асинхронно из инета данные. Надо ретранслировать эти данные на другие клиенты.
Допустим валятся на прогу данные с ID from 1 to 100
Клиент коннектится к проге и говорит. Шли мне ID 1 and 5 and 7
Другой коннектится и грит. А мне Id 20 and 33 and 77

Ремотинг - не имеет пост соединения. Как я узнаю что клиент жив? А если он дохнет то тайм аут больше 30 сек. А если многопоточно отсылать то иногда пакеты обгоняют друг друга ( проверено)
Ремотинг вешь хорошая но либо я не умею ее готовить либо она для моей задачи не подходит ( мне так и сказали на рсдн)

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 20.10.2005 (Чт) 13:22

GSerg писал(а):Тогда либо признать, что всё пишется правильно и ошибка в другом, либо использовать при приёме streamreader для прочтения...


Я от чего горюю.
SOAP это вроде (Простой протокол доступа к объектам)/
А тут - создай буфер. Собери байтики. Засунь в IO.Stream/ Не дай бог там лишний байтик. Хрень какая то а не SOAP/
Я то думал что это мне жизнь облегчит а тут чем дальше в лес тем боле дров.
Я тут делал так
For i=1 to 10
SendObject
next
Иногда все 10 проходят
Иногда 9 из 10 иногда 5 из 10
И фиг поймешь в чем дело. :(


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 87

    TopList