[vb.net] בעייה בNetworkStream - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


Mishka87

Recommended Posts

היי

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

ברשותי תוכנה, בעצם שתיים, צד שרט וצד לקוח, אני לוקח קובץ תמונה, ממיר אותו ל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

מיכאל

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...