读书人

一个TCPClient的有关问题

发布时间: 2011-12-21 23:56:01 作者: rapoo

一个TCPClient的问题。
设想:点击listen按钮,开始侦听7125端口
   点击btnConnect按纽,连接7125端口,并发关请求连接信息。
   time侦听7125端口听连接请求,如有请求,将信息写入txtServerStatus中,
   并返回允许连接信息,信息在client的txtClientStatus中显示。
问题:Server端可以收到信息并正常显示,但server返回信息client并不能收到。
   代码在下面,请指明错误的地方,谢谢。




[解决办法]
设定一超时控制(比如说timer)
while( 没有超时 )
If client.GetStream.DataAvailable() Then
client.GetStream().Read(InBuff, 0, InBuff.Length)
Temp = System.DateTime.Now & System.Text.Encoding.Default.GetString(InBuff)
txtClientStatus.Text = Temp

exit while
End If
end while

[解决办法]
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading

Public Class frmClient
'客户端Socket
Dim cliSocket As Socket
'连接状态
Dim IsConnected As Boolean = False
'接收信息线程
Dim myThread As Thread

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim remoteEP As New IPEndPoint(Net.IPAddress.Parse( "127.0.0.1 "), 11000)
cliSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Try
cliSocket.Connect(remoteEP)
ListBox1.Items.Add( "连接服务端成功! ")
IsConnected = True

myThread = New Thread(AddressOf ReciveMsg)
myThread.Start()
Catch ex As Exception
ListBox1.Items.Add(ex.Message)
End Try
End Sub

Sub ReciveMsg()
Dim bytes() As Byte = New Byte(1024) {}
Dim data As String = String.Empty
Dim tokens() As String

While True
Dim bytesRec As Integer = cliSocket.Receive(bytes)
data = Encoding.UTF8.GetString(bytes, 0, bytesRec)

tokens = data.Trim.Split( "| ")
Select Case tokens(0) '分析接收到的数据,可自己定义更多一些
Case "Exit "
IsConnected = False
BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1)) 'Invoke保证线程安全
cliSocket.Shutdown(SocketShutdown.Both)
cliSocket.Close()
Exit Sub
Case "Chat "
BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1)) 'Invoke保证线程安全
End Select

End While

End Sub

'发送信息
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim msg As Byte() = Encoding.UTF8.GetBytes( "Chat| " + TextBox1.Text)
Dim bytesSent As Integer = cliSocket.Send(msg)

ListBox1.Items.Add( "本地信息: " + TextBox1.Text)
TextBox1.Text = " "
End Sub

'非UI线程调用窗体控件,保证线程安全。与聊天实现无关。
Sub AddInfo(ByVal sender As System.Object, ByVal e As System.EventArgs)
ListBox1.Items.Add( "远程信息: " + sender.ToString)
End Sub

'关闭窗口时发关退出信息并清理资源
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If IsConnected Then
Dim msg As Byte() = Encoding.UTF8.GetBytes( "Exit|客户端退出: " + Me.Handle.ToString)
Dim bytesSent As Integer = cliSocket.Send(msg)


myThread.Abort()
End If

End Sub


End Class

读书人网 >VB Dotnet

热点推荐