Go TCP Read غير محظورة: معالجة استقبال البيانات غير المكتملة
في Go، قراءات TCP غير محظورة، مما يعني أنها تعود على الفور مع أي بيانات متاحة، حتى لو كانت أقل من المتوقع. يختلف هذا السلوك عن عمليات القراءة المحظورة في لغة C، والتي تنتظر حتى يتم تلقي الكمية المطلوبة من البيانات.
سبب عدم حظر القراءة
يعمل TCP كتدفق من البايتات والتي قد تكون مجزأة أثناء الإرسال. لذلك، من المستحيل تحديد نهاية الرسالة بناءً على عدد البايتات المستلمة فقط. يتطلب ذلك محددات مخصصة أو آليات أخرى لتحديد حدود الرسائل.حل للبيانات غير المكتملة
لقراءة عدد محدد من البايتات، استخدم io.ReadAtLeast أو io.ReadFull . بالنسبة للشروط التعسفية، قم بالتكرار على استدعاء القراءة حتى لا يكون هناك خطأ أو يتم استيفاء الشرط المحدد.مثال:
package main
import (
"fmt"
"net"
"time"
)
func main() {
conn, _ := net.Dial("tcp", "127.0.0.1:4243")
// Set a deadline to prevent hanging reads
_ = conn.SetReadDeadline(time.Now().Add(10 * time.Second))
// Loop to read until a newline is encountered
for {
buf := make([]byte, 512)
n, err := conn.Read(buf)
if err != nil {
fmt.Println(err)
break
}
if n > 0 {
str := string(buf[:n])
if str[len(str)-1] == '\n' {
fmt.Println(str)
break
}
}
}
}
اعتبارات أخرى
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3