|
Client.Close()
正确编译上述代码还需要在源文件的头部加入使用命名空间的引用,才能正确使用命名空间中的所有枚举、结构、类或模块等。
Imports System.net.Sockets ‘<-添加需要导入的命名空间 Imports System.Text ‘<-添加需要导入的命名空间 Public Class Form1
…… | 跟踪调试PPC程序需要在适当的模拟器下进行,譬如系统默认的PocketPC2002 模拟器,程序调试无误后可以连接到实际的PocketPC设备运行。实际部署到PPC设备需要在连接的桌面电脑上安装Microsoft ActiveSync将程序传输到用户目录中。
2、创建桌面服务端程序
启动Visual Studio .Net 2003,新建Visaul Basic项目,并选择“Windows应用程序”创建项目。项目创建完后Visaul Studio.Net会创建一个默认的主窗体Form1,在窗体上分别放置三个Label控件、两个TextBox控件、一个列表框控件和一个Button控件。
创建全局的TcpListener对象的实例来侦听特定的端口,代码片段如下:
‘创建在本机IP地址和端口侦听的TcpListener对象的实例
Listener = New TcpListener(“192.200.0.100”, 10200)
'开始侦听
Listener.Start()
‘侦听状态标志
Listening = True Label1.Text = "正在 192.200.0.100:10200 处侦听....."
…… | 通过计时器定时检测侦听器有无连接请求并启用多线程来处理接收到的数据,代码片段如下: '声明创建线程时,使用 ThreadStart 委托作为其唯一参数的构造函数创建 Thread 类的新实例
Dim CurThreadStart As ThreadStart Dim CurThread As Thread
'检测侦听器是否有挂起的连接请求,没有则退出计时器事件
If Not Listener.Pending() Then ExIT Sub End If
'有连接的请求则将计时器暂停,准备进行处理
tmProcessRequest.Enabled = False
'创建线程委托,传递需要操作的过程的地址
CurThreadStart = New ThreadStart(AddressOf ProcessRequest) CurThread = New Thread(CurThreadStart)
'开始一个线程
CurThread.Start()
'重新启动计时器
tmProcessRequest.Enabled = True |
将计时器触发事件的频率Interval(以毫秒为单位)适当调节可以改变服务程序响应连接请求的快慢。
计时器不断循环,一旦发现有连接的请求就会创建一个线程专门来处理这个连接,创建线程时需要传递处理连接的过程或函数的地址以被线程调用。
服务程序通过已连接的Socket获取数据,接收到的数据按相应的编码规则进行解码并将信息添加到列表框中:
……
CurThread = System.Threading.Thread.CurrentThread()
‘接受挂起的连接请求并返回可用来发送和接收数据的Socket
CurSocket = Listener.AcceptSocket
While Listening If CurSocket.Available > 0 Then ‘接收来自绑定的Socket的数据 Bytes = CurSocket.Receive(Buffer, Buffer.Length, 0) ‘将接收到的数据转化成相应编码的字符串 ReceivedData= Encoding.UTF8.GetString(Buffer) SyncLock CurThread lbReceived.ITems.Add(ReceivedData) End SyncLock …… | TCPListener.AcceptSocket接受挂起的连接请求,并且返回用于发送和接收数据的 Socket,此 Socket 继续用于和新连接上的客户端通信。
SyncLock 语句确保多个线程不会同时执行向列表框添加数据的操作。当线程到达 SyncLock 块时,将计算表达式并保持此互斥性,直到在表达式返回的对象上有锁为止。这防止了表达式在多个线程运行期间更改值,从而避免代码产生意外的结果。
向客户端返回服务端处理后的消息,代码片段如下:
'格式化返回消息 - 这是服务器端处理后的结果并返回到客户端。
BacktoClientData = System.DateTime.Now ‘向客户端传递服务端程序处理时的时间 Buffer = Encoding.UTF8.GetBytes(BacktoClientData.ToCharArray)
'通过打开的套接字将结果发送回客户端应用程序,然后关闭该套接字。
CurSocket.Send(Buffer, Buffer.Length, 0) CurSocket.Close() | 编译桌面服务端程序运行效果如下图所示:
当服务程序处理完一个连接后就向相应的PPC客户端返回一条成功信息,如下图所示:
至此,PPC客户端程序和桌面服务端程序编写完毕,该系统在安装WindowsXP SP2的桌面电脑和Dell X3i 的PPC上测试通过。
四、结论
本程序简单介绍了PC与PPC之间Socket通信方法,在实际应用中还有很多细节要做,并且还有可以拓展的地方。该模型为实现PC与PPC间复杂的信息交互,创建复杂的无线信息系统提供了一定技术基础。
上一页 [1] [2] |