16,553
社区成员
发帖
与我相关
我的任务
分享
'================================以下是服务器端程序=============================
Imports System.Net.Sockets
'使用到TcpListen类
Imports System.Threading
'使用到线程
Imports System.IO
'使用到StreamReader类
Public Class Form1
Private iPort As Integer = 8000
Private thThreadRead As Thread
'创建线程,用以侦听端口号,接收信息
Private tlTcpListen As TcpListener
'侦听端口号
Private blistener As Boolean = True
'设定标示位,判断侦听状态
Private nsStream As NetworkStream
'创建接收的基本数据流
Private srRead As StreamReader
'从网络基础数据流中读取数据
Private tcClient As TcpClient
Private Sub Listen()
Try
tlTcpListen = New TcpListener(iPort)
'以8000端口号来初始化TcpListener实例
tlTcpListen.Start()
'开始监听
StatusBar1.Text = "正在监听..."
tcClient = tlTcpListen.AcceptTcpClient()
'通过TCP连接请求
nsStream = tcClient.GetStream()
'获取用以发送、接收数据的网络基础数据流
srRead = New StreamReader(nsStream)
'以得到的网络基础数据流来初始化StreamReader实例
StatusBar1.Text = "已经建立TCP连接!"
'循环侦听
While blistener
Dim sMessage As String = srRead.ReadLine()
'从网络基础数据流中读取一行数据
If (sMessage = "STOP") Then
tlTcpListen.Stop()
'关闭侦听
nsStream.Close()
srRead.Close()
'释放资源
StatusBar1.Text = "无连接!"
thThreadRead.Abort()
'中止线程
Return
Else
'判断是否为断开TCP连接控制码
Dim sTime As String = DateTime.Now.ToShortTimeString()
'获取接收数据时的时间
ListBox1.Items.Add(sTime + " " + sMessage)
End If
End While
Catch ex As System.Security.SecurityException
MessageBox.Show("侦听失败!", "错误")
End Try
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Control.CheckForIllegalCrossThreadCalls = False
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
thThreadRead = New Thread(New ThreadStart(AddressOf Listen))
'以Listen过程来初始化线程实例
thThreadRead.Start()
'启动线程
Button1.Enabled = False
StatusBar1.Text = "服务已经启动!"
StatusBar1.ForeColor = Color.Red
End Sub
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
Try
thThreadRead.Abort() '中止线程
tlTcpListen.Stop() '关闭侦听
tcClient.Close()
nsStream.Close()
srRead.Close() '释放资源
Catch
End Try
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Private Sub Speech_control_master_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' Control.CheckForIllegalCrossThreadCalls = False
'End Sub
End Class
'================================以下是客户端程序=============================
Imports System.Net.Sockets
'使用到TcpListen类
Imports System.IO
'使用到StreamWriter类
'使用IPAddress类、IPHostEntry类等
Imports System.Net
Public Class Form1
Private swWriter As StreamWriter
'用以向网络基础数据流传送数据
Private nsStream As NetworkStream
'创建发送数据的网络基础数据流
Private tcpClient As TcpClient
'通过它实现向远程主机提出TCP连接申请
Private tcpConnect As Boolean = False
'定义标识符,用以表示TCP连接是否建立
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Control.CheckForIllegalCrossThreadCalls = False
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ipRemote As IPAddress
Dim sHostName As String
Dim tcpClient As TcpClient
Try
ipRemote = IPAddress.Parse(TextBox1.Text)
Catch
MessageBox.Show("输入的IP地址不合法!", "错误提示!")
Return
'判断给定的IP地址的合法性
End Try
Try
tcpClient = New TcpClient(TextBox1.Text, 8000)
'对远程主机的8000端口提出TCP连接申请
nsStream = tcpClient.GetStream()
'通过申请,并获取传送数据的网络基础数据流
swWriter = New StreamWriter(nsStream)
'使用获取的网络基础数据流来初始化StreamWriter实例
Button1.Enabled = False
Button2.Enabled = True
tcpConnect = True
StatusBar1.Text = "已经连接!"
Catch
MessageBox.Show("无法和远程主机8000端口建立连接!", "错误提示!")
Return
End Try
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If (TextBox2.Text <> "") Then
swWriter.WriteLine(TextBox2.Text)
'刷新当前数据流中的数据
swWriter.Flush()
TextBox2.Text = ""
Else
MessageBox.Show("发送信息不能为空!", "错误提示!")
End If
End Sub
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If tcpConnect Then
swWriter.WriteLine("STOP")
'发送控制码
swWriter.Flush()
'刷新当前数据流中的数据
nsStream.Close()
swWriter.Close()
'清除资源 ( )
End If
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
End Class
Private Sub ClientStart()
'创建IPEndPoint实例
Dim ipep As New IPEndPoint(IPAddress.Any, ClientPort)
'创建一个套接字,将所创建的套接字与IPEndPoint绑定
clientSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
clientSocket.Bind(ipep)
'设置套接字为收听模式
clientSocket.Listen(10)
While ListenFlag
Try
'在套接字上接收接入的连接
AcceptSocket = clientSocket.Accept()
clientThread = New Thread(New ThreadStart(AddressOf ReceiveData))
clientThread.IsBackground = True
clientThread.Start()
Catch ex As Exception
ShowMsg("监听出错:" & ex.Message)
End Try
End While
End Sub
Private Sub ReceiveData()
Dim ShowReciveMsgDel As New ShowReciveMsg(AddressOf ShowReciveMsgFun)
While True
Dim bufLen As Integer = 0
Dim dataRv As Byte() = New Byte(1023) {}
Try
bufLen = AcceptSocket.Available
AcceptSocket.Receive(dataRv, 0, bufLen, SocketFlags.None)
If bufLen = 0 Then
Continue While
End If
Catch ex As Exception
ShowMsg("在接受数据过程中:" & ex.Message)
Exit Sub
End Try
Dim RevMsgString As String = Encoding.Unicode.GetString(dataRv).Substring(0, bufLen)
If RevMsgString.StartsWith("cmd") Then
'处理的是服务器命令:
DoCmd(RevMsgString)
End If
Me.RichTextBoxMsg.Invoke(ShowReciveMsgDel, "服务端信息:" & vbCr & RevMsgString)
End While
End Sub
Private Sub DoCmd(ByVal CmdStr As String)
'...
End Sub
Private Sub Listener()
If uClient IsNot Nothing Then
uClient.Close()
End If
Dim msg As String
uClient = New UdpClient(port)
Dim mi As MethodInvoker = New MethodInvoker(AddressOf ShowRecMsg)
While True
If uClient.Available > 0 Then
msg = ""
Dim recdata As Byte() = uClient.Receive(RemoteIpEndPoint)
msg = System.Text.Encoding.Unicode.GetString(recdata)
If msg.StartsWith("cmd|") Then
DoCmd(msg, RemoteIpEndPoint.Address.ToString)
End If
RecMsg = String.Format("{0}:{1}{2}", RemoteIpEndPoint.Address.ToString, vbCrLf, msg)
Me.BeginInvoke(mi)
'让主线程去访问自己创建的控件.这里采用全局变量:RecMsg
End If
End While
End Sub
Private Sub Listener()
If uClient IsNot Nothing Then
uClient.Close()
End If
Dim msg As String
uClient = New UdpClient(port)
Dim mi As MethodInvoker = New MethodInvoker(AddressOf ShowRecMsg)
While True
If uClient.Available > 0 Then
Try
msg = ""
Dim recdata As Byte() = uClient.Receive(RemoteIpEndPoint)
msg = System.Text.Encoding.Unicode.GetString(recdata)
If msg.StartsWith("cmd|") Then
DoCmd(msg)
End If
RecMsg = String.Format("{0}:{1}{2}", RemoteIpEndPoint.Address.ToString, vbCrLf, msg)
BeginInvoke(mi)
'让主线程去访问自己创建的控件.这里采用全局变量:RecMsg
Catch ex As Exception
End Try
End If
End While
End Sub
' ....
Else
Dim sTime As String = DateTime.Now.ToShortTimeString()
'获取接收数据时的时间
ListBox1.Items.Add(sTime + " " + sMessage)
'
Socket.Close(10)
'等一秒
Thread.Sleep(1000)
'退出程序
Application.Exit()
Private Sub ReceiveData(ByVal pIAsyncResult As IAsyncResult)
Dim intByte As Int16
'回调函数结束后,重新建立线程,继续接收数据,该如何结束线程???利用定时器定时处理接收到的数据...
Dim myAsyncCallBack As New AsyncCallback(AddressOf ReceiveData)
intByte = EndSocket.EndReceive(pIAsyncResult)
txt_ip_receive.Text += Encoding.ASCII.GetString(bteAcceptData) + vbCrLf
EndSocket.BeginReceive(bteAcceptData, 0, 1024, 0, myAsyncCallBack, EndSocket)
End Sub
Private Sub ReceiveData(ByVal pIAsyncResult As IAsyncResult)
Dim intByte As Int16
'回调函数结束后,重新建立线程,继续接收数据,该如何结束线程???利用定时器定时处理接收到的数据...
Dim myAsyncCallBack As New AsyncCallback(AddressOf ReceiveData)
intByte = mySocket.EndReceive(pIAsyncResult)
txt_Receive_data.Text += Encoding.ASCII.GetString(bteAcceptData)
mySocket.BeginReceive(bteAcceptData, 0, 1024, 0, myAsyncCallBack, mySocket)
End Sub