ขอคำแนะนำการเชื่อมต่อระหว่างเครื่อง PC และ PDA (WinCE Device) โดยไม่ต้องใช้ ActiveSync

Last post 3 Mar 2010 14:47 by giffy2499. 34 replies.
Page 4 of 5 (35 items) < Previous 1 2 3 4 5 Next >
Sort Posts: Previous Next
  • 28 Feb 2010 23:46 In reply to

    Re: ขอคำแนะนำการเชื่อมต่อระหว่างเครื่อง PC และ PDA (WinCE Device) โดยไม่ต้องใช้ ActiveSync

    จริงๆ โค๊ดนี้ไม่ค่อยดีนะครับ เพราะว่าสร้าง Buffer ขนาดเท่าไฟล์เลย มันจะช้าครับเวลาทำงาน
    ลองหาโค๊ด "Copy Stream" ดูครับ น่าจะมีตัวอย่าง แล้วปรับตามใน Mobile ครับ เพราะใน Mobile บาง Property/Function จะไม่มี Smile
  • 1 Mar 2010 12:40 In reply to

    • patoo
    • Top 25 Contributor
    • Joined on 27 Feb 2010
    • Posts 16

    Re: ขอคำแนะนำการเชื่อมต่อระหว่างเครื่อง PC และ PDA (WinCE Device) โดยไม่ต้องใช้ ActiveSync

    ผมหาโปรแกรม copy stream ไม่เจอเลยครับ ไม่ทราบว่า ชำนาญ เรื่องการสง่ข้อมูลผ่าน SOCKET โดยใช้ TCP/IP มั้ยครับ
  • 1 Mar 2010 15:40 In reply to

    Re: ขอคำแนะนำการเชื่อมต่อระหว่างเครื่อง PC และ PDA (WinCE Device) โดยไม่ต้องใช้ ActiveSync

    http://stackoverflow.com/questions/230128/best-way-to-copy-between-two-stream-instances-c

    แบบนี้ครับ ใช้ Buffer ขนาด 32K (32768 = 32 * 1024, 1K = 1024) แต่ Copy จาก FileStream ไป NetworkStream (ใช้ TcpClient แล้วเมื่อ Connect ติด สั่ง GetStream เพื่อเขียน เราจะได้ NetworkStream มาใช้) อาจใช้ Buffer แค่ 4K ก็พอครับ เพราะว่า Network มันไม่เร็วขนาดนั้น

    public static void CopyStream(Stream input, Stream output)
    {
       
    byte[ buffer = new byte[32768];
       
    while (true)
       
    {
           
    int read = input.Read (buffer, 0, buffer.Length);
           
    if (read <= 0)
               
    return;
            output
    .Write (buffer, 0, read);
       
    }
    }

     

  • 1 Mar 2010 20:46 In reply to

    • patoo
    • Top 25 Contributor
    • Joined on 27 Feb 2010
    • Posts 16

    Re: ขอคำแนะนำการเชื่อมต่อระหว่างเครื่อง PC และ PDA (WinCE Device) โดยไม่ต้องใช้ ActiveSync

    ผมเลียนแบบ โปรแกรมของตัวอย่างนึง นะครับ แบบนี้ ใช้ได้มั้ยครับ เป็นโปรแกรม ที่ Mobile จะส่งไฟล์ไปที่ Server ผมใช้แค่ 1Kbyte ก่อนนะครับ แบบนี้ถูกมั้ยครับ Private Sub UpdateSignatureDetails() Dim filebuffer As Byte() Dim fileStream As Stream fileStream = File.OpenRead(Label1.Text) ReDim filebuffer(1024) fileStream.Read(filebuffer, 0, 1024) Dim networkStream As NetworkStream Dim clientSocket As New TcpClient([Global].Settings.GetString(SettingKeys.IpAddress), _ [Global].Settings.GetInt(SettingKeys.PortNumber)) networkStream = clientSocket.GetStream() networkStream.Write(filebuffer, 0, 1024) End Sub
  • 1 Mar 2010 20:48 In reply to

    • patoo
    • Top 25 Contributor
    • Joined on 27 Feb 2010
    • Posts 16

    Re: ขอคำแนะนำการเชื่อมต่อระหว่างเครื่อง PC และ PDA (WinCE Device) โดยไม่ต้องใช้ ActiveSync

    เอ ทำใมมันโพสแล้ว มันอ่านยากจัง ผมเลียนแบบ โปรแกรมของตัวอย่างนึง นะครับ แบบนี้ ใช้ได้มั้ยครับ เป็นโปรแกรม ที่ Mobile จะส่งไฟล์ไปที่ Server ผมใช้แค่ 1Kbyte ก่อนนะครับ แบบนี้ถูกมั้ยครับ Private Sub UpdateSignatureDetails() Dim filebuffer As Byte() Dim fileStream As Stream fileStream = File.OpenRead(Label1.Text) ReDim filebuffer(1024) fileStream.Read(filebuffer, 0, 1024) Dim networkStream As NetworkStream Dim clientSocket As New TcpClient([Global].Settings.GetString(SettingKeys.IpAddress), _ [Global].Settings.GetInt(SettingKeys.PortNumber)) networkStream = clientSocket.GetStream() networkStream.Write(filebuffer, 0, 1024) End Sub
  • 2 Mar 2010 0:17 In reply to

    Re: ขอคำแนะนำการเชื่อมต่อระหว่างเครื่อง PC และ PDA (WinCE Device) โดยไม่ต้องใช้ ActiveSync

    ถ้าใช้ Chrome มันจะเป็นงั้นครับ :P CMS ที่ใช้มันเก่าแล้ว ไม่รู้จัก
    จาก code ที่เห็นมันส่งแค่ 1 KB แล้วจบเลยนะครับ พอดีไม่เห็นมี Loop
  • 2 Mar 2010 13:22 In reply to

    • patoo
    • Top 25 Contributor
    • Joined on 27 Feb 2010
    • Posts 16

    Re: ขอคำแนะนำการเชื่อมต่อระหว่างเครื่อง PC และ PDA (WinCE Device) โดยไม่ต้องใช้ ActiveSync

    Private Sub UpdateSignatureDetails()

    Dim filebuffer As Byte()

    Dim fileStream As Stream

    fileStream = File.OpenRead(Label1.Text)

    ReDim filebuffer(1024)

    fileStream.Read(filebuffer, 0, 1024)

    Dim networkStream As NetworkStreamDim clientSocket As New TcpClient([Global].Settings.GetString(SettingKeys.IpAddress), _

    [Global].Settings.GetInt(SettingKeys.PortNumber))

    networkStream = clientSocket.GetStream()

    networkStream.Write(filebuffer, 0, 1024)

    End Sub

    เอ น่าจะอ่านง่ายขึ้นนะครับ    ถ้าอย่างนี้ มันน่า จะส่งได้แล้ว หรือเปล่าครับ

    แล้วฝั่งรับละครับ  มันจะรู้ได้นังไงว่า มันconnect แล้ว  และเมื่อ connect แล้ว มันจะรู้ได้อย่างไรว่า มีข้อมูลมาแล้ว  แล้วจะเขียนโปรแกรม รับ file ยังไงครับ  ถามยาวไปหรือเปล่าครับเนีย่  คือ มันยัง งง กับชีวิตตัวเองนะครับ

  • 2 Mar 2010 16:34 In reply to

    Re: ขอคำแนะนำการเชื่อมต่อระหว่างเครื่อง PC และ PDA (WinCE Device) โดยไม่ต้องใช้ ActiveSync

    เหอๆ เพราะอย่างนี้ละครับ ผมถึงทำโปรเจค 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 ออกไป)

    ลองเขียนดูครับ ไม่ยากเลย แต่ว่า จะเขียนให้มันทำงานได้ให้คนไปใช้ได้จริงๆ เนี่ยแหละครับ ที่ยาก Smile

Page 4 of 5 (35 items) < Previous 1 2 3 4 5 Next >