作者atien666 (...)
看板C_Sharp
標題[問題] 非同步模式TCP連線
時間Wed Jul 20 00:08:58 2016
最近在實作一些小程式
目的是透過非同步連線來接收條碼機掃過的條碼資訊
然後將結果印出在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://webptt.com/m.aspx?n=bbs/C_Sharp/M.1468944541.A.6FD.html
1F:→ Litfal: 看你的敘述看不出是送出多送了,還是接收沒清空buff 07/20 15:02
2F:→ atien666: 偵錯的時候看起來像buffer沒清空 07/21 00:04
3F:→ atien666: 而且第一次接到值的時候都會被斷成只有10byte 07/21 00:05
4F:→ atien666: 正常加上跳脫字元應該要有24byte 07/21 00:06
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
5F:→ Litfal: 因為兩個的連線永遠沒中斷,你要自己檢查分隔符號 07/21 00:59
6F:→ Litfal: UTF8.GetString後不要直接加入Data內,給一個string去接變 07/21 01:01
7F:→ Litfal: 數字串,然後在那個字串裡面找分格符號 07/21 01:02
8F:→ Litfal: 可以用 Split 方法去切 07/21 01:03
9F:→ atien666: 後來是用斷行符號來判斷 感謝樓上了 07/24 01:39