none
TCPClent 問題 RRS feed

  • 問題

  • 如果我有一個客戶端,和兩個伺服端,客戶要隨時切換伺服來得到資訊

    我想請問有辦法用一個TCPClient來切換IP就好,還是得為兩台伺服器各別建立TCPClient

    2010年11月4日 上午 02:22

解答

  • 現在只能猜猜看了.

    問題也許有可能是因為你send資料給PLC後, 太快就做Receive的動作

    也許你在Do迴圈的第一行應該要先Sleep 一下, 先試試用3/10秒看看


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 小見光二 2010年11月8日 上午 12:34
    2010年11月6日 上午 10:01
    版主

所有回覆

  • 使用兩個執行個體會比較好. 不然還得開開關關的.
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年11月4日 上午 04:16
    版主
  • 兩個 TcpClient ,因為網路狀況變化很大,不見得能同時連線,而且連線速度也會變,各跑各地比較不會亂。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年11月4日 下午 01:39
  • 謝謝妳們的建議,但我實測結果有點小問題,

    首先我建立兩個TCPClient變數(A與B),第一次兩個TCPClient都可以正常與伺服器溝通,但是第二次使用A時,卻無法使用?是否

    要開關TCPClient阿!!想請問有沒有範例可以參考??

    2010年11月5日 上午 01:00
  • 先把你的Code 列出來吧.
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年11月5日 上午 02:29
    版主
  • '這是我建立TCPClient部份,總共建立兩個:
    Dim 網路連線 As New TcpClient()
    網路連線.Connect(IPAddress.Parse(遠端IP位置), 502)
    網路連線.ReceiveBufferSize = 256
    網路連線.SendBufferSize = 256
    Me.本機IP位置 = 本機IP位置
    Me.遠端IP位置 = 遠端IP位置
    Me.通訊實體 = 網路連線
    
    '我利用集合按順序加入兩個:
    Dim 通訊元件 As New Dictionary(Of Byte, 網路化通訊元件類別)
    
    '這是我使用的程式碼:     
    For i As Byte = 0 To 通訊元件.Count - 1
     Me.通訊元件(i).清除監視資料()
     Me.通訊元件(i).寫入染程資料(傳送內容)
    
     Dim 讀出值 As Integer = 0
     Do
      讀出值 = Me.通訊元件.讀取監視資料
      If 讀出值 = 1 Then
       Success = True
      ElseIf 讀出值 = 2 Then
       Me.通訊元件.清除監視資料()
       Exit Do
      End If
     Loop While Success <> True
    Next
    
    '目前測試問題:
    '1.時好時壞,多執行幾次,就會停在Do...Loop(表示從伺服端讀不出資料),檢查結果是"通訊實體"的Connected = False
    '2.嘗試在For迴圈第一行停五秒,可以順利執行.
    
    2010年11月5日 上午 03:41
  • 這應該是設備回應延遲造成的吧 ?

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年11月5日 上午 05:08
    版主
  • 但是寫入大量資料,就算停了五秒,有時候還是會出現情況(1)那樣. 想請問我要在我的程式碼內加上那些判斷,來補強?? 剛剛有看到一篇文章,同一時間一個PORT只能被一個TCPClient指定,那像我這樣雖然兩個TCPClient都是 使用PORT:502,但是同個時間點只有一個在使用,不知道是不是這個原因導致多執行幾次,TCPClient會斷線.

     經過一下午測試,發現光單一台(不用切換伺服A.B)就會出現問題,尤其在Do...Loop時都不停頓的話,迴圈跑幾次(讀幾次)後就會出現問題,我有設定中斷點來看,發現我的通訊元件屬性都變成"無法評估"

    我補充說明我的整個流程:我的應用程式將連到兩台人機(使用ModBusTCP)讀寫資料.

    1.建立兩個TCPClient,IP位置分別是兩台人機的IP位置

    2.將兩個TCPClient放到集合中使用.

    3.利用For迴圈向兩台人機讀寫資料

    4.

     a.寫入資料到人機的暫存器

    b.利用某一暫存器填入1值,通知人機我寫值成功

    c.人機收到1,便開始搬移資料

    d.此時我利用Do...loop等待人機回應我,如果暫存器填入2,將正常結束

    目前錯誤都發生在Do..loop內,等待人機回應搬移成功(值2),會出現我的用來通訊的那個TCPClient變數,屬性都會變成無法評估.此情況我猜想應該是斷線??所以請有經驗的人,告訴我如何改善.

    2010年11月5日 上午 05:42
  • 1. TcpClient一般我是不用指定Port的, 都是由系統自行決定, 除非有特別的用途或要求.

    2. 兩個同時存在TcpClient 使用同一個Tcp Port出去, 這在架構上就不正確了, 應該會有錯誤訊息才對.

    3. 你有使用Timer嗎 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年11月5日 下午 01:31
    版主
  • 錯誤訊息與錯誤行號很重要...

    看看本版置頂文如何發問。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年11月5日 下午 03:08
  • 目前會發生問題的地方為 --->  讀出值 = Me.通訊元件.讀取監視資料 (這裡主要是要從人機端那邊讀回"搬移是否成功的值".)

    發生的問題為 ---> GetStream.Write 會停住. (中斷點來看,我的TcpClient屬性會變成 "屬性無法評估")

    如果我強制跳離後,我再使用剛那個TcpClient (沒有重建),卻還可以執行傳送與讀取功能.

    我的問題點是:如果事後還可以使用這個TcpClient的讀寫功能,為什麼持續監聽時,感覺上TcpClient是斷的??

    2010年11月6日 上午 02:24
  • 可能要Check 一下 網路化通訊元件類別的Code.

    PS: 我剛仔細看了一下, 502 應該是Server 端的Listen的Port, 你的Local 端根本是由系統選擇Port的


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年11月6日 上午 02:39
    版主
  • 謝謝大大指教,現在觀念更清楚了. 

    502是遠端也就是人機端的Port,所以一開始我搞錯了.

    我後來用一台人機來測試,就會卡在 --- >通訊線路.GetStream.Write(指令位元組, 0, 指令位元組.Length) '傳送指令

    Protected Overrides Sub 傳送資料(ByVal 指令 As String, ByVal 指令位元組() As Byte)
    通訊線路.GetStream.Flush() '清空緩衝區資料
    通訊線路.GetStream.Write(指令位元組, 0, 指令位元組.Length) '傳送指令
    End Sub
    

    此時中斷點來看,通訊線路會出現 "屬性無法評估".

    用Try Catch也沒有任何錯誤產生.

     

    2010年11月6日 上午 03:05
  • 1. 多嘴問一句, 你的程式該不會真的用中文寫吧 ?
    2. flush這個Method其實目前是沒有作用的, 在MSDN上有註明

    清除資料流的資料。 這個方法保留給未來的版本使用。

    Flush 方法會實作 Stream. . :: . Flush 方法;然而,因為 NetworkStream 未經緩衝處理,其對網路資料流沒有影響。 呼叫 Flush 方法不會擲回例外狀況。

    所以先把這行拿掉吧


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年11月6日 上午 03:21
    版主
  • (1)對阿.

    (2)已拿掉.目前經過下午測試,出現錯誤機會不大,但是還是會發生.目前可以確定是發生問題時,

    我使用My.Computer.Network.Ping是Ping的到.傳送指令前也放了為0的封包來補抓10035,也都有抓到.

    但是就是讀不回人機上的某個暫存器(也就是人機搬移成功後,會將其值設成1).但是人機端有看到值寫成功.

    2010年11月6日 上午 08:54
  • 現在只能猜猜看了.

    問題也許有可能是因為你send資料給PLC後, 太快就做Receive的動作

    也許你在Do迴圈的第一行應該要先Sleep 一下, 先試試用3/10秒看看


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 小見光二 2010年11月8日 上午 12:34
    2010年11月6日 上午 10:01
    版主