当前位置: 代码迷 >> VB Dotnet >> 请大家帮忙,为何tcp通讯,小弟我开始进入一次线程接受消息后,后面就无法进去了
  详细解决方案

请大家帮忙,为何tcp通讯,小弟我开始进入一次线程接受消息后,后面就无法进去了

热度:121   发布时间:2016-04-25 02:02:37.0
请大家帮忙,为何tcp通讯,我开始进入一次线程接受消息后,后面就无法进去了
本帖最后由 sinat_27738553 于 2015-04-29 00:07:44 编辑
    因为我以前没写过VB,并且没有TCP通讯和线程经验,所以有很多不懂之处,请帮忙指导下,十分感谢
主要问题是这样的,我是按下BUTTON1进入线程,mylisten是我的接收程序,我按下BUTTON1进入一次线程后,之后其他机子给我发消息都不能进入线程,调用mylisten。因为这程序是要跟另外一个人通讯的,他不是我们公司的,所以不能让他久等,我不能慢慢研究下,就来请教下各位,看我的程序出错在哪里,谢谢了。
Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports Microsoft.VisualBasic
Imports System.Threading

Public Class Form1
    Public th As Thread
    Public tcpl As TcpListener
    
    Public Sub SendMessage(ByVal IP As String, ByVal SendMsg As String)
        Try
            Dim tcpc As New TcpClient(IP, 9999)
            Dim tcpStream As Net.Sockets.NetworkStream = tcpc.GetStream
            Dim reqStream As New IO.StreamWriter(tcpStream)
            Dim sendmsg1(30) As Byte
            Dim Send As Integer = Int32.Parse(SendMsg)
            sendmsg1 = BitConverter.GetBytes(Send)
            tcpStream.Write(sendmsg1, 0, 2)
            reqStream.Flush()
            ' tcpStream.Close()
            ' tcpc.Close()
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        End Try
    End Sub
    Private Function MyListen()
        ' Dim myclient As TcpClient
        Dim server As TcpListener
        server = Nothing
        Dim MyBuffer(1024) As Byte
        Dim data As String = Nothing
        Try
            server = New TcpListener(IPAddress.Parse("192.168.1.13"), 9999)
            server.Start()
            While True
                Dim client As TcpClient = server.AcceptTcpClient()
                Dim stream As NetworkStream = client.GetStream()
                'data = Nothing
                Dim i As Int32
                i = stream.Read(MyBuffer, 0, MyBuffer.Length)
                client.Close()
            End While
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        Finally
            server.Stop()
        End Try
        Return 0
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        th = New Thread(AddressOf MyListen)
        th.IsBackground = True
        th.Start()
        ' Dim myclient As New TcpClient
        ''  Dim ipadress As IPAddress
        'Dim port As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999)
        ' myclient.Connect(port)
        '  Control.CheckForIllegalCrossThreadCalls = False //线程
        ''Button1.Enabled = False
        SendMessage("192.168.1.100", TextBox2.Text)
        
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        SendMessage("192.168.1.100", TextBox2.Text)
    End Sub
End Class


------解决思路----------------------
VB看不明白,不过这种问题你调试一下不就知道哪里的问题了?
------解决思路----------------------
同一个端口只能开一个侦听。既然第一个进程 While True .. End While 一直在循环,不会走到server.Stop(),就不能再开。
一个侦听可以对多个客户端的:C# TcpListener如何同时接收多个客户端的数据
------解决思路----------------------
后来 new 的线程运行到 server = New TcpListener(IPAddress.Parse("192.168.1.13"), 9999)
都因 9999 端口被占用报错

另:看你的代码,好象并非少用 VB 的原因。
------解决思路----------------------
 Dim client As TcpClient = server.AcceptTcpClient() 这个会阻塞线程  只有有新的连接连进来后才会执行下去,执行完又阻塞线程。。
                Dim stream As NetworkStream = client.GetStream()
------解决思路----------------------
Dim client As TcpClient = server.AcceptTcpClient() 这个会阻塞线程
同意5楼
步骤:
1. 新建listener线程
2. listener线程里AcceptTcpClient()  只做这个事情,一收到客户端请求以后就开辟一个新的线程做数据收发

' 监听线程的循环
While True
                Dim client As TcpClient = server.AcceptTcpClient()
                Dim ReceiveThread as new thread(addressof ReceiveSub)
                ReceiveThread.start()
 End While
' 数据接收里的循环
Private sub ReceiveSub()
         '数据接收
End Sub
  相关解决方案