因为我以前没写过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