TCP长连接 客户端关闭时怎么会有异常??急死俺了
服务端:
Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
listener1 = New TcpListener(System.Net.IPAddress.Parse("192.168.4.171"), "30000")
listener1.Start()
listening1 = True
Timer4.Enabled = True
end sub
Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick
Dim CurThreadStart As ThreadStart
Timer4.Enabled = False
If listener1.Pending() Then
CurThreadStart = New ThreadStart(AddressOf request)
CurThread1 = New Thread(CurThreadStart)
CurThread1.Start()
End If
Timer4.Enabled = True
End Sub
Public Sub request()
CurThread1 = System.Threading.Thread.CurrentThread()
Dim buf(3000) As Byte
Dim senddata As String
Dim intLen As Integer
Dim ReceivedData As String
Dim cursocket As Socket
cursocket = listener1.AcceptSocket
cursocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 5000)
cursocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000)
Try
While listening1
Thread.Sleep(100)
If cursocket.Available > 0 Then
'接收来自绑定的Socket的数据
intLen = cursocket.Receive(buf, cursocket.Available, 0)
'将接收到的数据转化成相应编码的字符串
ReceivedData = System.Text.Encoding.Default.GetString(buf, 0, intLen)
System.Console.WriteLine(ReceivedData)
If ReceivedData = "close" Then
System.Threading.Thread.Sleep(1000)
System.Console.WriteLine(ReceivedData)
cursocket.Shutdown(Net.Sockets.SocketShutdown.Both)
cursocket.Close()
Exit While
End If
End If
If bln_rfid = True Then
bln_rfid = False
senddata = "张三:李四:王五"
buf = System.Text.Encoding.Default.GetBytes(senddata)
cursocket.Send(buf, buf.Length, 0)
End If
End While
Catch ex As Exception
cursocket.Shutdown(Net.Sockets.SocketShutdown.Both)
cursocket.Close()
System.Console.WriteLine(ex.Message + ex.Source + "关掉了")
End Try
End Sub
客户端:
Private Sub getconnect()
Dim ip As System.Net.IPAddress
Dim strrecvdatabegin As String
Dim buf(255) As Byte
Dim ilen As Integer
Dim beginbuff(255) As Byte
Dim strtemp As String
Dim strtemp2 As String
Dim strtemp3 As String
Dim strtemp4 As String
Try
tcpclient_info = New System.Net.Sockets.TcpClient
ip = System.Net.IPAddress.Parse(str_ip)
tcpclient_info.Connect(ip, "30000")
tcpclient_info.LingerState.Enabled = False
While (True)
System.Threading.Thread.Sleep(100)
ReDim beginbuff(255)
ReDim buf(255)
Application.DoEvents()
lnlasttime = Environment.TickCount
While Not tcpclient_info.GetStream.DataAvailable()
Application.DoEvents()
End While
'If Environment.TickCount - lnlasttime < 1000 And bln_close = False Then
If tcpclient_info.GetStream.DataAvailable() Then
tcpclient_info.GetStream.Read(beginbuff, 0, beginbuff.length)
strrecvdatabegin = System.Text.Encoding.Default.GetString(beginbuff, 0, beginbuff.length)
txtTemp.Text = strrecvdatabegin
End If
End While
Catch ex As Exception
'System.Console.Write(ex.Message)
End Try
End Sub
Private Sub frm_manager_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
Dim strdata As String
Dim buf(255) As Byte
strdata = "close"
buf = System.Text.Encoding.Default.GetBytes(strdata)
tcpclient_info.GetStream.Write(buf, 0, buf.Length)
tcpclient_info.GetStream.Flush()
blnreturn = False
Timer1.Enabled = False
Timer2.Enabled = False
tcpclient_info.Close()
Me.Close()
Application.Exit()
End Sub
我建的是长连接,连上之后不断开,服务端一有数据就往客户端发送.
在客户端关闭的时候给服务器发送一个close的字段,显示客户端关闭连接了,然后服务端把这个线程断掉.但是客户端这边会报异常,报在红颜色字的那里,怎么都找不出来原因,不过我断点跟踪过好象是它一直会在While Not tcpclient_info.GetStream.DataAvailable()这个循环里面跳不出来,到底怎么解决啊,困扰死了