2015/01/06(Tue) 23:28:25 編集(投稿者)
> <pre><pre>初投稿となります。
> 私は今までVBの通信について学んでいたのですが、調べても分からなくなり、質問させていただきました
> 使用言語はVB2008です。
>
> 質問内容は、TCP/IPを用いた通信のプログラムについてです。
> 現在、データを送信するプログラムと、データを受信するプログラムを交互に行うことで、
> データの送受信をしようとしています。その結果、1度目はうまくいくのですが、2度目以降には
> ”破棄されたオブジェクトにアクセスできません。 オブジェクト名 'System.Net.Sockets.TcpClient' です。”
> というエラーメッセージが送信した側に表示され、停止します。
> どうすればよいか、ご教授お願いします。
>
> プログラム内容
> Imports System.Net.Sockets
> Imports System.Net
> Public Class Form1
> Private int As Integer
> Private client As New TcpClient()
> Private hostname As String
> Private work As Threading.Thread
> Private server As TcpListener
> Private sdata As Boolean = False
>
> Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
> '受信する
> work = New Threading.Thread(AddressOf Dowork)
> work.Start()
> End Sub
> Sub Dowork()
> server = New TcpListener(IPAddress.Any, 9000)
> server.Start()
>
> Try
> While True
> Dim client As TcpClient = server.AcceptTcpClient()
> Dim stream As NetworkStream = client.GetStream
> While True
> Dim data(100) As Byte
>
> Dim len As Integer = stream.Read(data, 0, data.Length)
> int = System.Text.Encoding.ASCII.GetString( _
> data, 0, len)
> TextBox2.Text = int
> client.Close()
> server.Stop()
> End While
> End While
> Catch ex As Exception
> 'TextBox1.Text = "サーバー終了"
> End Try
> End Sub
>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> '送信する
> Do
> '接続
> Dim hostname As String
> hostname = TextBox1.Text
> Try
> client.Connect(hostname, 9000) 2度目にここを通過する際にエラーが発生する
> TextBox2.Text = "正常に接続できました"
> Catch ex As Exception
> 'TextBox2.Text = ex.Message
> End Try
> '送信
> Try
> Dim a As Object
> Dim stream As NetworkStream = client.GetStream
> a = 0
> Dim buffer() As Byte = System.Text.Encoding.ASCII.GetBytes(a)
> stream.Write(buffer, 0, buffer.Length)
> TextBox2.Text = "正常に送信されました"
> sdata = True
> client.Close()
> Catch ex As Exception
> TextBox2.Text = ex.Message
> End Try
> Loop While sdata = False
> End Sub
>
> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
> Control.CheckForIllegalCrossThreadCalls = False
> End Sub
>
> End Class