C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: VBマイグレーションTipsのソケット通信について


(過去ログ 45 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■23997 / inTopicNo.1)  VBマイグレーションTipsのソケット通信について
  
□投稿者/ コーヒーブレイク (1回)-(2008/08/26(Tue) 13:52:37)

分類:[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

引用返信 編集キー/
■24093 / inTopicNo.2)  Re[1]: VBマイグレーションTipsのソケット通信について
□投稿者/ コーヒーブレイク (3回)-(2008/08/27(Wed) 17:30:48)
いろいろ試行錯誤を続けた結果、自己解決しました。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -