|
分類:[VB.NET/VB2005]
開発環境:WindowsXP SP3
使用言語:VB2005
はじめまして、コーヒーブレイクといいます。
ほんと今更ながらVB6からVB2005(.net)へ移行しようともがいています。
本やインターネットはいろいろ見て勉強中なのですが、実践も大事と思い
仕事柄通信が必須ですのでタイトルにある通りソケット通信をやってみようと
試行錯誤しています。
マイクロソフトが用意してくれているVBマイグレーションTipsに参考があったので
それを元に肉付けしようと考えてまずはクライアント側を下記ソースまでやりました。
現状VB6で作成済みのサーバー側と通信は正常に行えています。
で、みなさんに質問したいことは以下の2点についてです。
1.現状のソースで決定的にまずい部分があればご指摘いただきたいです。
コーディングだけではなく、作り方的なこともお願いします。
2.現状のソースでは2回目以降の受信が出来ません。
理由はLoopから抜けていることが原因と理解しているのですが、どう
変更すればいいかのアイデアがありません。
アドバイス等いただけたら助かります。
VB6が出来ればそれぐらい・・・と言われるかもしれませんが、自分自身少し
迷走しているのでやさしくアドバイスいただけると助かります。
では以下にソースを添付します。
よろしくお願いいたします。
-- コントロールの説明 -------------------------------------------------------------------------
Button1 ---> 接続ボタンです。
Button2 ---> 切断ボタンです。
Button3 ---> 送信ボタンです。
TextBox1 ---> 送信データ入力欄です。
TextBox2 ---> 受信データ表示欄です。
BackgroundWorker1 ---> スレッドです。
-- ソースコード -------------------------------------------------------------------------------
Public Class Form1
Private intPortNo As Integer = 1111
Private objNetStream As NetworkStream
Private objTcpClient As TcpClient
Private strReceivedData As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'*** 接続 ***
objTcpClient = New System.Net.Sockets.TcpClient
With objTcpClient
Try
'=== 接続+ストリームセット ===
objTcpClient.Connect("localhost", intPortNo)
objNetStream = .GetStream
'=== 受信スレッド開始 ===
BackgroundWorker1.RunWorkerAsync()
Catch Ex As Exception
MsgBox(Ex.Message)
End Try
End With
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'*** 切断 ***
'=== 受信スレッド停止要求 ===
BackgroundWorker1.CancelAsync()
'=== 受信スレッド停止待ち ===
Do Until BackgroundWorker1.IsBusy = False
Thread.Sleep(1000)
Loop
'=== 切断 ===
objTcpClient.Close()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'*** 送信 ***
Dim bytSendBuffer As Byte()
Try
With objNetStream
'=== 送信 ===
bytSendBuffer = System.Text.Encoding.Default.GetBytes(TextBox1.Text)
.Write(bytSendBuffer, 0, bytSendBuffer.Length)
End With
Catch Ex As Exception
MsgBox(Ex.Message)
End Try
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'*** 受信 ***
Dim bytReceiveBuffer(255) As Byte
Dim intDataLength As Integer
Try
Do
If objNetStream.DataAvailable Then
'=== 受信データありなら受信 ===
intDataLength = objNetStream.Read(bytReceiveBuffer, 0, bytReceiveBuffer.Length)
strReceivedData &= System.Text.Encoding.Default.GetString(bytReceiveBuffer).Substring(0, intDataLength)
ElseIf Not strReceivedData Is Nothing Then
Exit Do
End If
'=== 受信スレッド停止要求の監視 ===
If BackgroundWorker1.CancellationPending = True Then
Exit Do
End If
Loop
Catch Ex As Exception
MsgBox(Ex.Message)
End Try
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
'*** 受信データ表示 ***
If strReceivedData.Length > 0 Then
TextBox2.Text = "リモートホストから「" & strReceivedData & "」を受信しました。"
strReceivedData = ""
End If
End Sub
End Class
|