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

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

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

Re[3]: TCP/IPを用いた通信について VB


(過去ログ 125 を表示中)

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

■74499 / inTopicNo.1)  TCP/IPを用いた通信について VB
  
□投稿者/ カラメル (1回)-(2015/01/06(Tue) 23:21:32)

分類:[.NET 全般] 

2015/01/06(Tue) 23:27:43 編集(投稿者)
2015/01/06(Tue) 23:27:04 編集(投稿者)

間違えて2重で投稿してしまいました。
下のNO.2が質問となります。
引用返信 編集キー/
■74500 / inTopicNo.2)  Re[1]: TCP/IPを用いた通信について VB
□投稿者/ カラメル (2回)-(2015/01/06(Tue) 23:23:57)
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

引用返信 編集キー/
■74501 / inTopicNo.3)  Re[2]: TCP/IPを用いた通信について VB
□投稿者/ Azulean (399回)-(2015/01/06(Tue) 23:36:39)
2015/01/06(Tue) 23:37:12 編集(投稿者)

No74500 (カラメル さん) に返信
>>データの送受信をしようとしています。その結果、1度目はうまくいくのですが、2度目以降には
>>”破棄されたオブジェクトにアクセスできません。 オブジェクト名 'System.Net.Sockets.TcpClient' です。”
>>というエラーメッセージが送信した側に表示され、停止します。
>>どうすればよいか、ご教授お願いします。

TcpClient は基本的に使い捨てです。
(Close してしまうと再利用できないので New し直す必要がある)

しかし、あなたのコードはフォームのメンバー変数で Dim client As New TcpClient として作っており、アプリケーションで一度しか作っていないからです。
client を Button1_Click の中で宣言、作成すればとりあえず回避できるでしょう。

(いろいろと突っ込みどころのあるコードですが…)
引用返信 編集キー/
■74502 / inTopicNo.4)  Re[3]: TCP/IPを用いた通信について VB
□投稿者/ カラメル (3回)-(2015/01/06(Tue) 23:55:29)
2015/01/06(Tue) 23:58:22 編集(投稿者)

No74501 (Azulean さん) に返信
 返信ありがとうございます。
おかげさまで解決することができました。
コードについては色々調べながら書いた物なので、あまり分かりやすいものではなく
突っ込みどころも多かったと思いますが、今後精進していきたいと思います。
この度は本当にありがとうございました。
今後もお世話になることがあるかもしれませんが、
その時はよろしくお願いいたします
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -