台灣最大程式設計社群網站
線上人數
1082
 
會員總數:245985
討論主題:189565
歡迎您免費加入會員
討論區列表 >> VB.NET >> tcp socket 接收資料後,轉傳資料出問題
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
tcp socket 接收資料後,轉傳資料出問題
價值 : 10 QP  點閱數:1707 回應數:18
樓主

phoenix
門外漢
0 1
30 9
發送站內信

請教大家:
vb 2013 tcp socket程式,
server 接收client A資料後,關閉server
啟動client轉傳資料至另一server出問題,在這一行
SocketClient2.BeginSend(byteSend, 0, byteSend.Length, _
SocketFlags.None, SendData2, SocketClient2)
請問這是甚麼問題呢?
謝謝




搜尋相關Tags的文章: [ tcp ] ,
本篇文章發表於2017-11-21 15:39
1樓
回應

P陳
檢舉此回應
可以告知什麼訊息嗎?
本篇文章回覆於2017-11-21 16:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

phoenix
檢舉此回應
感謝您的回應,訊息如下:

標題是:
ObjectDisposedException未處理

內文是:

類型 'System.ObjectDisposedException' 的未處理例外狀況發生於 System.dll

其他資訊: 無法存取已處置的物件。

疑難排解提示:
嘗試使用資源前請先確定你未釋放它。

請問這是什麼意思呢?該如何處理。

感謝幫忙!

本篇文章回覆於2017-11-21 16:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

P陳
檢舉此回應
沒有看到您整個程式
1.第一個 server 先不要關,等傳給 client A 資料給 第二 server 後再關

2 轉 第二個 Server 後
通訊的通道沒有打開

有沒有加 NEW
本篇文章回覆於2017-11-23 07:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

phoenix
檢舉此回應
感謝您的幫忙。
我的狀況如下
1.我有三台電腦A是client,B是server兼client,C是另一台server
2.若手動A送給B,B送給C都正常
3.問題詳述如下:
(1)B是server兼client時,當B收到A送過來的資料,經過處理後,將結果送給C時會發生錯誤。
(2)您的方法,我已經測試完畢,但問題仍未解決,依然存在。
(3)我是用visual studio 2013中的vb,我的目前做法是B處收到理資料處理完後,一定要先關閉B的server,
再開啟對C的連線,傳送資料給C,再關閉C的連線;最後啟動B的server等待下一次A的連線。
4.目前看到程式兩個問題
(1)關閉B的server後,處理完資料傳送至C時,出現在這行程式錯誤,導致無法傳送資料給C
dataLength = CInt(AcceptClient.GetSocketOption( _
SocketOptionLevel.Socket, _
SocketOptionName.ReceiveBuffer))
(2)偶而一兩次傳送至C成功,但B無法再次啟動server功能
5.謝謝您!


本篇文章回覆於2017-11-23 22:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

P陳
檢舉此回應

看起來這句是在 B 執行的,如果 C 是用輪巡的的話,就有可能會漏掉
dataLength = CInt(AcceptClient.GetSocketOption( _
SocketOptionLevel.Socket, _
SocketOptionName.ReceiveBuffer))

因為 C 是 Service
B 及 C 都是 windows 的 VisualStudio 2013

A->B 如果確定沒有問題

B->C 這段
我會用 Web Service 或 WCF Service 的來作,簡單且方便很多

本篇文章回覆於2017-11-24 09:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
你有開執行緒嗎?
把B的接收端單獨存在成一個執行緒,
然後把B要傳資料的socket連線也弄成單一個執行緒。


本篇文章回覆於2017-11-24 11:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

P陳
檢舉此回應
樓主的 B 接收是 C 電腦
--------------------------

知道您的意思了
B送到C後 B再開一個執行緒來收
-------------------------

phoenix :
一直忘了問您 1.是C沒有收到 或 2. C回傳後 B沒有收到
我還是覺得用 web service 最方便
本篇文章回覆於2017-11-24 11:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

phoenix
檢舉此回應
謝謝P陳

我嘗試了web service一些基本做法(但我第一次學web service),
但整個系統還有其他考量,
所以我暫不考慮web service。仍然使用tcp。

我目前架構為:A是client,B是server兼client,C是server,
個別A送給B,B送給C都正常工作,
但我的目標是A送給B,B收到資料處理後再送給C,
目前情況是B處理資料後,送給C時送不出去,出現錯誤=>B沒送出去(不是B有送出去C沒收到)

謝謝!
本篇文章回覆於2017-11-25 10:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

phoenix
檢舉此回應
Daimon好:

因為我只會tcp的一對一連,不會開執行緒,
先前雖有試過,但一直沒成功,網路搜尋,目前只會基本的Client送資料給server,
但server如何送給client這部分還不會,正在努力中

謝謝!
本篇文章回覆於2017-11-25 10:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

P陳
檢舉此回應
目前情況是B處理資料後,送給C時送不出去,出現錯誤=>B沒送出去(不是B有送出去C沒收到)
以下情況:

1.C沒有收到 所以沒有回應 B 回應錯誤
2.B送出後關掉 C送不回來 B 回應錯誤
3.B收到A的資料後 關TCP 再開與 C的 TCP (這中間請加個延時 threading.thread.sleep(200) 停0.2秒

請確認 C 有沒有收到

----------------------------------------
ObjectDisposedException未處理
看起來是多執行緒的問題了
中間有段提到這個
你的程式碼中是否有用到多執行緒 ? 並且在這些執行緒中有更新畫面控制項的部份 ?

多執行緒問題

這跟我前陣子在用 RS232 的情況很像,電腦為了不讓系統停頓,溝通的部份自動會用 多執行緒 來處理。

您用他的方法 試試
1.Thread.IsBackground 設為 true
2.Try Catch 包起來, 並特別處理 ObjectDisposedException (其實就是 Catch 它, 然後不理它)

本篇文章回覆於2017-11-25 11:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

phoenix
檢舉此回應
謝謝P陳

我目前架構為:
A是client,B是server兼client,C是server,
個別A送給B,B送給C都正常工作,
但我的目標是A送給B,B收到資料處理後再送給C,

目前最新情況:
是A送給B,B收到資料處理後再送給C,C可以成功一次後,
但B要再利用控制項按鈕動server時無法啟動


您提到:
=================================================
你的程式碼中是否有用到多執行緒 ? 並且在這些執行緒中有更新畫面控制項的部份 ?

多執行緒問題

這跟我前陣子在用 RS232 的情況很像,電腦為了不讓系統停頓,溝通的部份自動會用 多執行緒 來處理。
=================================================
是的:我的程式執行中有更新畫面控制項的部份,我確認我沒用到多執行緒,但是否是vb自己啟用多執行緒我就不知道了,
但我在程式中卻找不到更新畫面控制項的細節怎麼運作,好像被vb的function給包起來了,看不到。

請教您:
1.這行"Thread.IsBackground 設為 true"是要放在程式哪呢?
2.這行"Try Catch 包起來, 並特別處理 ObjectDisposedException (其實就是 Catch 它, 然後不理它)"這是要怎麼做呢?

謝謝!




本篇文章回覆於2017-11-25 12:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

P陳
檢舉此回應
那二段話要放那堙A沒看到程式我又不是算命的,怎會知。

您早點交待清楚(如您#11所述),我們就可以少繞一大圈了

當B.第一次送完後,你是如何【關】那個連線的呢?

因為 那個連線了被您清除(釋放)掉了,才會有下列那個錯誤訊息。
---> 嘗試使用資源前請先確定你未釋放它。




本篇文章回覆於2017-11-25 13:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

phoenix
檢舉此回應
謝謝P陳

^_^,不好意思,因為程式一直在努力中,所以錯誤狀況不盡相同,造成我沒說明清楚。

========================================================
其實我不會釋放資源。
關閉 B server程式是參考網路的,如下:
Private Sub btnClose_Click(sender As System.Object, ByVal e As EventArgs) Handles btnClose.Click
'關閉Socket通訊
IsConnected = False
CheckState() '控制項狀態變更
If Not SocketClient Is Nothing Then
SocketClient.Close()
End If
SocketServer.Close()
End Sub
請幫我看看檢視是否哪邊錯了?

========================================================
另外,這行"Try Catch 包起來, 並特別處理 ObjectDisposedException (其實就是 Catch 它, 然後不理它)",
開啟 B server程式如下
Private Sub btnCreate_Click(sender As System.Object, ByVal e As EventArgs) Handles btnCreate.Click

Try
'建立Socket物件()
SocketServer = New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, _
ProtocolType.Tcp)
'繫結IP位址與通訊埠()
Dim ep As New IPEndPoint(IPAddress.Parse(server_ip), _
CInt(server_port))
SocketServer.Bind(ep)
' 開啟伺服器Socket物件接聽功能()
SocketServer.Listen(10)
IsConnected = True
CheckState()
SendDataListBox.Items.Add("伺服端Socket建立(create_Bottm)完成!")
SendDataListBox.Update()
'開始準備接收客戶端Socket連接()
SocketServer.BeginAccept(Accept, SocketServer)
Catch sk As SocketException
MessageBox.Show("SocketException ErrodCode:" & _
sk.ErrorCode.ToString & vbCrLf & _
"SocketException Message:" & sk.Message, _
"SocketException", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub

是否刪除一部分剩下
Private Sub btnCreate_Click(sender As System.Object, ByVal e As EventArgs) Handles btnCreate.Click

Try
'建立Socket物件()
SocketServer = New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, _
ProtocolType.Tcp)
'繫結IP位址與通訊埠()
Dim ep As New IPEndPoint(IPAddress.Parse(server_ip), _
CInt(server_port))
SocketServer.Bind(ep)
' 開啟伺服器Socket物件接聽功能()
SocketServer.Listen(10)
IsConnected = True
CheckState()
SendDataListBox.Items.Add("伺服端Socket建立(create_Bottm)完成!")
SendDataListBox.Update()
'開始準備接收客戶端Socket連接()
SocketServer.BeginAccept(Accept, SocketServer)
Catch sk As SocketException
'不理它
End Try

End Sub
就可以呢?

謝謝!
本篇文章回覆於2017-11-25 14:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

phoenix
檢舉此回應
謝謝P陳

我目前動作順序是
1.C送資料給B
2.B收資料成功,處理資料完畢後,B關閉server
3.B啟動為client功能,送資料給C=>到此完成一筆資料傳送,且依切正常
4.B再次啟動server,等待A的連線
程式第一次在1,2,3都正常,但在第4步,就無法啟動server,出現錯誤

謝謝!
本篇文章回覆於2017-11-25 14:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

P陳
檢舉此回應
你貼的的程式中沒有 beginsend 指令哦!!
您的 開關是用 手動的?

目前先不要送到 C
直接 A->B 關B 再開B 再 A->B 關B 開B 再 A->B
都沒有問題再來考慮 B->C 的問題



本篇文章回覆於2017-11-25 17:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.