עבור לתוכן

[vb.net] בעייה בNetworkStream

Featured Replies

פורסם

היי

מקווה שתוכלו לעזור לי.

ברשותי תוכנה, בעצם שתיים, צד שרט וצד לקוח, אני לוקח קובץ תמונה, ממיר אותו לbyte array ושולח דרך הקוד שנמצא למטה.

בצד השיני אני מקבל את המידע, מפענח אותו, ומציג כתמונה.

עקרונית התוכנה עובדת, הבעייה היא שלא כל פעם כל התמונה נשלחת, כשליש מהמקרים אני מקבל רק חלק מהתמונה.

לאחר בדיקות אני משוכנע שהבעייה היא בשלב של השליחה, ולא קריאת הקובץ או הצגת התמונה.

הקוד השולח:

Dim tcpClient As New System.Net.Sockets.TcpClient()

Try

tcpClient.Connect("127.0.0.1", 8001)

Dim networkStream As NetworkStream = tcpClient.GetStream()

If networkStream.CanWrite And networkStream.CanRead Then

'Get Data To Send

Dim sendBytes As Byte() = ConvertFromPictureBoxToArray()

'Get size of Data

Dim len As Long = sendBytes.Length '76544 byte

Dim Bitelen() As Byte = BitConverter.GetBytes(len)

'Send The Size Of Data

networkStream.Write(Bitelen, 0, Bitelen.Length)

'Send The Data

networkStream.Write(sendBytes, 0, len)

End If

networkStream.Close()

tcpClient.Close()

Catch ex As Exception

End Try

הקוד המקבל:

Dim tcpListener As New TcpListener(8001)

tcpListener.Start()

While (True)

Try

If tcpListener.Pending Then

Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()

'Read the stream into a byte array

Dim networkStream As NetworkStream = tcpClient.GetStream()

'Read The Size Of Data

Dim len As Long

Dim byteLen( 8) As Byte

networkStream.Read(byteLen, 0, 8)

len = BitConverter.ToInt64(byteLen, 0)

'Read The Data

Dim bytes(len) As Byte

networkStream.Read(bytes, 0, len)

'Handle The Data

ConvertFromArrayToPictureBox(bytes)

networkStream.Close()

tcpClient.Close()

End If

Catch Ex As Exception

End Try

End While

tcpListener.Stop()

מה יכולה להיות הבעייה שלא תמיד לא כל המידע מגיעה לצד השני?

תודה מראש

מיכאל

פורסם

תשים לב שהפונקציה read מחזירה לך INT - את מספר הבתים שהיא קראה בפועל.

יכול להיות שבקריאה בודדת לא קיבלת את כל הבתים שלך, ולכן תצטרך לקרוא פעם נוספת - הפעם את מספר הבתים שנותרו לך.

גם בקריאה השניה יכול להיות שלא חזרו לך כל הבתים שרצית, ולכן תצטרך לקרוא כבר בפעם השלישית ואף יותר.

פורסם
  • מחבר

צודק.

פעמים בודדות אני קורא את כל הביטים, לרוב חסרים כ10%, והתמונה עדיין נראת מלאה.

הבעייה שבשליש מהזמן חסרים מעל חצי מהביטים.

אני מצליח לחשב כמה חסרים, אבל כיצד אני קורא אותם ומצרף לאותם הניטים אותם קראתי קודם?

מיכאל

פורסם
  • מחבר

הצלחתי, תודה על העזרה

למעוניינים, הפתרון:

החלפת שורת ה:

networkStream.Read(bytes, 0, len)

ב:

Dim numBytesToRead As Integer = len

Dim numBytesRead As Integer = 0

While (numBytesToRead > 0)

Dim n As Integer = networkStream.Read(bytes, numBytesRead, numBytesToRead)

If (n = 0) Then Exit While

numBytesRead = numBytesRead + n

numBytesToRead = numBytesToRead - n

End While

מיכאל

פורסם

הערה: את הקוד שאתה מדביק, שים בתוך תג קוד (כפתור אחד ימינה מתג ציטוט).

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים