เหอๆ เพราะอย่างนี้ละครับ ผมถึงทำโปรเจค http://coresharp.net/blogs/frontpage/archive/2010/02/28/coresharp-networking-core-client-server.aspx นี้ขึ้นมา มาถามได้จังหวะมากครับ
จาก Code ที่ให้มา มันจะส่งครั้งเดียว แล้วจบเลย (1KB) ตอน Read ต้องอยู่ใน Loop ครับ ลองเอา Code ที่ผมให้ไปแปลงเป็น VB ดูครับ ตัวแปลงอยู่ด้านบน ขวามือ เขียนว่า Code Converter
การที่จะให้ 2 เครื่องต่อกันได้ เครื่องหนึ่งจะต้องเปิด TcpListener เอาไว้เป็น Server จากนั้น สั่ง BeginAccept (เปิด Thread) Accept (ไม่เปิด Thread) ซึ่งถ้าสั่งแบบ Accpet โปรแกรมก็จะค้างไปเลย รอให้มีคนต่อเข้ามา ด้วย TcpClient.Connect โปรแกรมถึงจะทำงานต่อในบรรทัดต่อไป
ทั้ง BeginAccept และ Accept เมื่อจบการทำงาน จะได้ TcpClient หรือ Socket มา แล้วแต่ว่าเราเลือก Accept แบบไหน เพื่อใช้ในการส่ง/รับข้อมูลครับ
สำหรับ Tcp มันจะมอง Network เป็น Stream ดังนั้น เราจะต้องสั่ง tcpClient.GetStream เพื่อใช้อ่าน หรือ เขียน ทางฝั่งเขียนไม่งงเท่าไหร่ เพราะเรา Write อะไรไป มันก็ส่งไปตามนั้น แต่ทางฝั่ง Read เนี่ยละที่จะงง
เนื่องจากว่ามันเป็น Stream มันไม่มีทางบอกเราได้ว่า ข้อมูลมาถึงหรือยัง เรามีหน้าที่ต้องตรวจสอบตัวแปรชื่อ "DataAvailable" ของ Network Stream เองครับ ว่ามีข้อมูลให้อ่านไหม ถ้ามี การสั่ง NetworkStream.Read ก็จะอ่านออกมา ใส่ Buffer ให้ พร้อมกับ Return ว่า อ่านมาได้กี่ Byte ดังนั้น Loop นี้ ก็จะต้องทำงานไปเรื่อยๆ จนกว่าจะรู้เองว่า ข้อมูลส่งมาครบแล้ว
แล้วจะรู้ได้ไงว่า ข้อมูลส่งมาครบแล้ว เราก็ต้องส่ง Byte ปิดมา เป็น สัญลักษณ์ว่า จบไฟล์แล้ว ซึ่ง Byte ปิดนี้ แล้วแต่เรากำหนดครับ อาจจะส่ง Byte 0 มา ติดๆ กัน 10 ตัว ตามด้วย 1 10 ตัว อะไรแบบนี้ หรือว่า ตอน Connect ติด ทั้งสองเครื่อง อาจจะสร้าง Guid แล้วส่งไปแลกกัน เพื่อกำหนดว่า Guid นี้ คือ Byte ปิด ก็ได้ (Guid สร้างโดยการใช้ Guid.NewGuid, จะส่ง Guid ไปผ่าน Network Stream ง่ายสุด คือ แปลงมันเป็น Byte Array ด้วย System.Text.Engoding.ASCII.GetBytes( myGuid.ToString() ); แล้ว Write ออกไป)
ลองเขียนดูครับ ไม่ยากเลย แต่ว่า จะเขียนให้มันทำงานได้ให้คนไปใช้ได้จริงๆ เนี่ยแหละครับ ที่ยาก 