[問題] 非同步模式TCP連線

看板C_Sharp (C#)作者 (...)時間9年前發表 (2016/07/19 16:09), 9年前編輯推噓0(009)
留言9則, 2人參與, 最新討論串1/1
最近在實作一些小程式 目的是透過非同步連線來接收條碼機掃過的條碼資訊 然後將結果印出在label上 參考了這篇文章 http://renjin.blogspot.tw/2009/02/asynchronous-tcp-client-using-c.html 照著修改自己的需求後已經能夠接收到值 但是接回來的值處理上有點問題不知該如何解決 文章寫到的state.data 是stringbuilder 所以用append來加入收到的data 但是這樣就會變成data一直累加在後面,沒辦法只顯示最新的一筆 比如說第一筆aaaaaaaaaa 第二筆bbbbbbbbbb 第三筆cccccccccc 就會變成 aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa bbbbbbbbbb bbbbbbbbbb 這樣 cccccccccc 試著用state.data.insert來加入,抓取的位置又會跑掉 也嘗試把state.data改成用string的型態來接收值 會變成沒有辦法把結果印在label上 自己覺得問題是在EndReadCallback裡,但是嘗試了好久不知道問題在哪 想請問問題大概在哪呢? 對於C#還不是很熟悉,只能照著文章範例稍微理解修改 希望有人能夠解惑~~先感謝了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.205.148.193 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1468944541.A.6FD.html

07/20 15:02, , 1F
看你的敘述看不出是送出多送了,還是接收沒清空buff
07/20 15:02, 1F

07/21 00:04, , 2F
偵錯的時候看起來像buffer沒清空
07/21 00:04, 2F

07/21 00:05, , 3F
而且第一次接到值的時候都會被斷成只有10byte
07/21 00:05, 3F

07/21 00:06, , 4F
正常加上跳脫字元應該要有24byte
07/21 00:06, 4F
private void EndReadCallback(IAsyncResult ar) { StateObject state = (StateObject)ar.AsyncState; TcpClient client = state.Client; NetworkStream stream = client.GetStream(); int bytesRead = stream.EndRead(ar); if (bytesRead > 0) { state.Data.Append(Encoding.UTF8.GetString(state.Buffer, 0, bytesRead)); stream.BeginRead(state.Buffer, 0, state.BufferSize, new AsyncCallback(EndReadCallback), state); } else { client.Close(); DisplayResults(state.Data.ToString()); } } 對這段有些疑問 條碼機一直傳值進來的話 就永遠都不會進到else裡的DisplayResults(state.Data.ToString()) 所以我是把它移到 state.Data.Append(Encoding.UTF8.GetString(state.Buffer, 0, bytesRead));的後面去 覺得怪怪的 不知道該如何修改 還是其實那篇文章和我想做的其實不太一樣@@ ※ 編輯: atien666 (123.205.148.193), 07/21/2016 00:12:46

07/21 00:59, , 5F
因為兩個的連線永遠沒中斷,你要自己檢查分隔符號
07/21 00:59, 5F

07/21 01:01, , 6F
UTF8.GetString後不要直接加入Data內,給一個string去接變
07/21 01:01, 6F

07/21 01:02, , 7F
數字串,然後在那個字串裡面找分格符號
07/21 01:02, 7F

07/21 01:03, , 8F
可以用 Split 方法去切
07/21 01:03, 8F

07/24 01:39, , 9F
後來是用斷行符號來判斷 感謝樓上了
07/24 01:39, 9F
文章代碼(AID): #1NZb2TRz (C_Sharp)
文章代碼(AID): #1NZb2TRz (C_Sharp)