WinSock 网络通信的桥梁
数字职场
在开发需要进行网络通信的软件时,例如聊天程序、电力控制系统等,常常要用到WinSock控件,所以在招聘软件开发人员时,就常常考查应聘者对WinSock的理解和掌握程度。下面我们以广电运通公司的WinSock考题为例,讲解如何答题。
题目:如何使用WinSock编写网络程序?请分别写出客户端和服务端的程序开发流程。
剖析:这道考题指明要使用WinSock来编写网络程序,就是要考查应聘者对WinSock的掌握程度。Winsock是网络数据传输控件,它可以与远程计算机建立连接,通过用户数据报协议 (UDP)或者传输控制协议 (TCP)进行数据交换。
一般用得较多的是TCP协议,所以解题最好也用TCP协议。在客户端指定服务器的端口和IP地址后,尝试和服务器建立连接,服务器在监听到客户端的连接请求后尝试与客户端建立通信,通信建立后,数据就可以交换了。
客户端开发流程:指定WinsockClient的Protocol为sckTCPPortocol,并指定服务器的IP地址和端口号,然后调用WinsockClient的Connect尝试建立和服务器的连接,如果没有连接上,则几秒后再次尝试建立连接直至连接成功,建立连接后使用SendData发送数据,使用GetData接收数据(图1)。

服务器开发流程:指定服务器的端口号,使用Listen进行监听,收到客户端的连接请求时尝试连接,连接成功后发送、接收数据和客户端类似(图2)。

解题步骤
第一步:创建客户端程序
在VB中新建一个项目,在主窗口上添加一个Timer(用于监控网络连接状态)、四个Text(用于输入服务器的IP地址、输入端口号、显示聊天记录、输入聊天内容)、一个WinSock(用于创建连接和接收数据,设置属性Portocol为sckTCPPortocol)、三个Command(用于连接服务器、发送聊天内容、关闭程序)、一个StatusBar(用于显示连接状态)。客户端关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
LHostNam = WinsockClient.LocalHostName '获取本地计算机名和信息
StateBar.Panels(1).Text = "客户端: " + LHostNam
timeNums = 4
If timeNums = 4 Then '时钟控件发现连接断开时调用过程LinkSrv来连接服务器
Call LinkSrv'当timeNums为4时调用过程,否则改变timeNums的值
End If
timeNums = timeNums - 1
If timeNums = 0 Then timeNums = 4
Select Case WinsockClient.State
Case sckClosed
StateBar.Panels(2).Text = "远程为服务端: None"
StateBar.Panels(3).Text = "远程服务器断开,等待重新连接。"
'把WinsockClient.State的值显示在状态栏中,只有为7才表示连接成功
Case sckConnected
StateBar.Panels(2).Text = "远程为服务端:" + WinsockClient.RemoteHostIP
StateBar.Panels(3).Text = "已经连接上服务器,可以聊天了"
Command2.Enabled = True'"发送"按钮可以使用
第二步:创建服务器程序
再新建一个项目,在主窗口上添加一个Timer、三个Text(用于输入端口号、显示聊天记录、输入聊天内容)、一个WinSock、两个Command(用于发送聊天内容、关闭程序)、一个StatusBar。服务端关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
LHostNam = Winsockserver.LocalHostName
StateBar.Panels(1).Text = "服务器: " + LHostNam
timeNums = 4
'使用Timer控件和过程LinkSrv来建立服务器和客户端的连接,Winsockserver的State不为7则创建连接
Select Case Winsockserver.State
Case sckClosed
StateBar.Panels(2).Text = "客户端: None"
StateBar.Panels(3).Text = "远程客户端断开,等待重新链接。"
Winsockserver.Close'关闭Winsockserver
Winsockserver.LocalPort = Text2.Text'指定端口号
Winsockserver.Listen'监听请求
'当客户端发送Connect后,服务器会触发连接请求,这时服务器就需要建立连接
Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long)
If Winsockserver.State <> sckClosed Then Winsockserver.Close
Winsockserver.Accept requestID
'服务器和客户端建立连接后,服务器就可以接收客户端的数据并向客户端发送数据了,接收数据也需要用到Winsockserver_DataArrival,把接收到的数据转换后显示出来
Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)
Dim tmpstr As String
Winsockserver.GetData tmpstr
chatbox.Text = chatbox.Text + tmpstr
chatbox = chatbox.Text & vbCrLf '加空行
我的建议>>
WinSock是软件的网络功能的基础,被大多数软件采用。大家在做题的时候,如果能进行深度的分析,例如写出工业控制软件采用TCP协议、聊天软件采用UDP协议, 就会博得考官的好感。