读书人

VB.NET Socket 经典有关问题。

发布时间: 2012-07-08 17:43:43 作者: rapoo

VB.NET Socket 经典问题。。。。
看了很多答案,小弟还是不解呀,求高手赐教。

现在很多Socket的源码都是清一色的聊天工具,无非是将一个客户端一个窗口的文本框内容发送到服务器的一个列表框。。。

小弟初次接触Socket,请问假如我在客户端定义两个文本框1、2,都输入内容。。。然后服务器端也定义两个文本框1、2,分别接受客户端的内容。即客户端1发送到服务器端1、客户端2发送到服务器。。。
怎么才能实现哦。。
谢谢了


1、服务端

Imports System.Net

Imports System.Net.Sockets

Imports System.Threading

Imports System.Text

Imports System.Diagnostics



Public Class frmServer



'服务端的Socket

Dim listener As Socket

'与客户端会话的Socket

Dim mySocket As Socket

'服务端的运行状态

Dim IsRun As Boolean = False

'监听接收数据线程

Dim myThread As Thread



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

myThread = New Thread(AddressOf Listen)

myThread.Start()

End Sub



Public Sub Listen()

Dim bytes() As Byte = New [Byte](1024) ...{}

Dim data As String = String.Empty

Dim tokens() As String



Dim localEndPoint As New IPEndPoint(Net.IPAddress.Parse("127.0.0.1"), 11000)

'初始化socket

listener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

'绑定端口

listener.Bind(localEndPoint)

'开始监听

listener.Listen(10)



BeginInvoke(New EventHandler(AddressOf AddInfo), "服务端已启动,正在等待连接......")



mySocket = listener.Accept()

IsRun = True



While True

Dim bytesRec As Integer = mySocket.Receive(bytes)

data = Encoding.UTF8.GetString(bytes, 0, bytesRec)



tokens = data.Trim.Split("|")

Select Case tokens(0) '分析接收到的数据,可自己定义更多一些

Case "Chat"

BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1)) 'Invoke保证线程安全

Case "Exit"

IsRun = False

BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1)) 'Invoke保证线程安全

mySocket.Shutdown(SocketShutdown.Both)

mySocket.Close()

Exit Sub

End Select

End While



End Sub



'发送信息

Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click

Dim msg As Byte() = Encoding.UTF8.GetBytes("Chat|" + TextBox1.Text)

mySocket.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 IsRun Then



Dim msg As Byte() = Encoding.UTF8.GetBytes("Exit|服务端退出: " + Me.Handle.ToString)

Dim bytesSent As Integer = mySocket.Send(msg)

End If

listener.Close()

mySocket = Nothing

myThread.Abort()

End Sub



End Class



2、客户端

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



[解决办法]
如果你理解了聊天工具,能发能收,这个变通一下就是了。

如果多不愿意自己去理解,就上这儿来找现成,可能有点抱歉
[解决办法]
最简单的去看101实例里的

读书人网 >VB Dotnet

热点推荐