1

2つのアプリケーションを異なるコンピューターで実行しています。1つはクライアントで、もう1つはサーバーです。クライアント->サーバーでの通信は完全に機能しますが、反対方向ではありません。

サーバーコード:

Imports System.IO
Imports System.Net
Public Class Form1
    Dim listener as Net.Sockets.TcpListener
    Dim listenThread as Threading.Thread

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        listener = New Net.Sockets.TcpListener(Net.IPAddress.Any, 32111)
        listener.Start()
        listenThread = New Threading.Thread(AddressOf DoListen)
        listenThread.IsBackground = True
        listenThread.Start()
End Sub


Private Sub DoListen()
        Dim sr As IO.StreamReader
        Dim sw As IO.StreamWriter
        Do
            Try
                Dim client As Net.Sockets.TcpClient = listener.AcceptTcpClient
                sr = New IO.StreamReader(client.GetStream)
                sw = New IO.StreamWriter(client.GetStream)
                Dim Lines As String() = sr.ReadToEnd.Split(New Char() {","c}) 'get client data

                sr.Close()
                sw.Write("Message123") ' try to send data to client
                sw.Close()

            Catch
            End Try
        Loop
    End Sub
End Class

クライアントコード:

Public Class Form1
    Dim Command As String
    Dim thread As Threading.Thread

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        thread = New Threading.Thread(AddressOf MyProcess)
        thread.IsBackground = True
        thread.Start()
    End Sub

Private Sub Send(ByVal Command As String)
        Try
            Dim client As New System.Net.Sockets.TcpClient
            client.Connect(TextBox1.Text, 32111)
            Dim writer As New IO.StreamWriter(client.GetStream)
            writer.Write(Command)
            writer.Flush()
            client.Close()
            MsgBox("Command has been sent successfully")
        Catch ex As Exception
        End Try
    End Sub

Private Sub MyProcess()
        Do
            Dim client As New System.Net.Sockets.TcpClient
            client.Connect("192.168.1.2", 32111)
            Dim reader As New IO.StreamReader(client.GetStream)
            MessageBox.Show(reader.ReadToEnd)
            reader.Close()
            client.Close()
        Loop
    End Sub
End Class

問題は何も起こらないということです。MessageBoxは「Message123」と言ってクライアントに表示されません。

4

1 に答える 1

1

クライアントが新しいソケットを作成して接続するたびに、2 つのアプリケーション間でまったく新しい通信チャネルが開かれます。あなたの例では、サーバーは最初のソケットでメッセージを返していますが、クライアントでは最初のソケットから読み取ろうとしません。代わりに、2 番目のソケットを開き、そこから読み取ります。リクエストメッセージを送信したのと同じソケットから読み取るように変更する必要があります。

あなたがそれについて考えるなら、あなたはおそらく真実ではない仮定をしている. クライアント マシンからそのポート上のサーバーへの有効なソケットは 1 つだけであると想定しています。しかし、明らかにこれは真実ではありません。たとえば、多数の個別の FTP クライアントを同じサーバーに対して実行できます。各アプリケーションは、同じサーバー上の同じポートに対して必要な数のソケットを開くことができ、すべて互いに完全に独立しています。

于 2012-12-02T13:04:38.913 に答える