前提・実現したいこと
VB.netでTCPIPのサーバ、クライアントソフトを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
サーバ側のソフトで質問です。状況として、クライアントからの接続要求で接続後に、
クライアントからの受信はサーバ側のrichtextboxに表示できています。
ところが、サーバからクライアントにデータを送信(writeline)すると、サーバの
受信用richtextboxにデータが表示しようとしてしまって、クライアント側にデータが送られません。
該当のソースコード```
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Public Class Form1
Dim ServerStatus As Boolean = False Dim ServerTrying As Boolean = False Dim Server As TcpListener Dim Clients As New List(Of TcpClient) Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load CheckForIllegalCrossThreadCalls = False End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click StartServer() End Sub Function StartServer() If ServerStatus = False Then ServerTrying = True Try Server = New TcpListener(IPAddress.Any, 4305) Server.Start() ServerStatus = True Threading.ThreadPool.QueueUserWorkItem(AddressOf Handler_Client) Catch ex As Exception ServerStatus = False End Try ServerTrying = False End If Return True End Function Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click StopServer() End Sub Function StopServer() If ServerStatus = True Then ServerTrying = True Try For Each Client As TcpClient In Clients Client.Close() Next Server.Stop() ServerStatus = False Catch ex As Exception StopServer() End Try End If Return True End Function Function Handler_Client(ByVal state As Object) Dim TempClient As TcpClient Try Using Client As TcpClient = Server.AcceptTcpClient If ServerTrying = False Then Threading.ThreadPool.QueueUserWorkItem(AddressOf Handler_Client) End If Clients.Add(Client) TempClient = Client 'Dim TX As New StreamWriter(Client.GetStream) Dim RX As New StreamReader(Client.GetStream) If RX.BaseStream.CanRead = True Then While RX.BaseStream.CanRead = True Dim RawData As String = RX.ReadLine Richtextbox1.text += Client.Client.RemoteEndPoint.ToString + ">>" + RawData + vbNewLine End While End If If RX.BaseStream.CanRead = False Then Client.Close() Clients.Remove(Client) End If End Using Catch ex As Exception If TempClient.GetStream.CanRead = False Then TempClient.Close() Clients.Remove(TempClient) End If End Try Return True End Function Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown If e.KeyCode = Keys.Enter Then e.SuppressKeyPress = True If TextBox1.Text.Length > 0 Then SendToClients(TextBox1.Text) TextBox1.Clear() End If End If End Sub Function SendToClients(ByVal Data As String) If ServerStatus = True Then If Clients.Count > 0 Then Try For Each Client As TcpClient In Clients Dim TX1 As New StreamWriter(Client.GetStream) TX1.WriteLine(Data) TX1.Flush() Next Catch ex As Exception SendToClients(Data) End Try End If End If Return True End Function Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click End Sub
End Class
### 試したこと textbox1に入力された文字をクライアントに送る仕様です。 また、クライアントからの文字は、Richtextbox1に表示される仕様です。 サーバからクライアントにデータを送信するときに、デバッガで追いました。 データ送信すると、SendToClientsのTX1.WriteLine(Data)が実行された後、 Handler_Clientが反応してしまって受信用のRichtextbox1が更新されてしまい、 クライアントにデータを送信することができません。 ### 補足情報(FW/ツールのバージョンなど) visual studio 2019 VB ここにより詳細な情報を記載してください。
コードはインデントされるようにしてください。インデントされてないコードは質問者さん自身も読む気がしないのでは?
タグは VB.NET の方がよさそうです。付け直すか追加してください。
仰る通りです。申し訳ありません。本日、再投稿させて頂きます。
このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
再投稿とのことですが、別に新たにスレッドを立てるのはダメですよ。質問は編集・修正できます。このスレッドの質問欄を編集して質問を続けてください。
提示されているコードを動作させてみましたが、仰っている現象が確認できませんでした。
クライアント側の実装も関係あるかもしれません。
回答2件
あなたの回答
tips
プレビュー