用 VB.net 编写 Socket 通信程序
服务器端:
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading
Public Class Form1
Dim s As Socket = Nothing
Dim t As Thread
' 新建一个线程,用于处理收到的Socket 数据包
Public Sub WaitData()
' 使用 TCP 协议
s = New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, ProtocolType.Tcp)
' 定义 IP 和端口
Dim localEndPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 11024)
' 绑定到该 Socket
s.Bind(localEndPoint)
' 侦听,最多接收10个连接
s.Listen(10)
While (True)
' 用来储存接收到的字节
Dim bytes(1024) As Byte
' 若接收到,则创建一个新的 Socket 与之连接
Dim ss As Socket = s.Accept()
MessageBox.Show("ss connected = " & ss.Connected.ToString)
' 接收数据,若用 ss.send(byte()), 则发送数据
ss.Receive(bytes)
' 将其插入到列表的第一项之前
' 以下用法会弹出不安全线程访问错误
'ListBox1.Items.Insert(0, Encoding.Unicode.GetString(bytes))
' 对不带参数的方法的委托
Dim strGetS As String
strGetS = Encoding.Unicode.GetString(bytes)
BeginInvoke(New EventHandler(AddressOf AddInfo), strGetS)
' 若使用 Encoding.ASCII.GetString(bytes), 则接收到的中文字不能显示
End While
End Sub
Private Sub AddInfo(ByVal sender As Object, ByVal e As EventArgs)
ListBox1.Items.Insert(0, "消息>>> " & sender.ToString)
End Sub
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
' btnStart 的 click 事件中,加入如下代码:
' 建立新的线程
t = New Thread(AddressOf WaitData)
' 启动线程:
t.Start()
' 按钮不可用,避免另起线程
btnStart.Enabled = False
End Sub
Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
' 在BtnStop的click事件中, 加入如下代码
Try
' 关闭 Socket
s.Close()
' 终止线程
t.Abort()
Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
' 启用按钮
btnStart.Enabled = True
End Try
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
' 为了防止用户不点击Stop直接退出,而不能使线程结束,则应在窗体的closing事件中,加入如下代码:
Try
s.Close()
t.Abort()
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
End Class
客户机端:
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class Form1
Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
Try
Dim bytes(1024) As Byte
Dim s As Socket
s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, _
ProtocolType.Tcp)
Dim localEndPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 11024)
s.Connect(localEndPoint)
If Not s.Connected Then
Dim strRetPage As String = "无法连接到远程主机"
MessageBox.Show(strRetPage)
Else
MessageBox.Show("s.Connected is " & s.Connected.ToString & vbCrLf)
s.Send(Encoding.Unicode.GetBytes(TextBox1.Text))
s.Close()
End If
Catch ex As Exception
'MessageBox.Show(ex.ToString)
MessageBox.Show("错、错、错")
End Try
End Sub
End Class
(完)


没有评论:
发表评论