WinSock 网络通信的桥梁

数字职场

在开发需要进行网络通信的软件时,例如聊天程序、电力控制系统等,常常要用到WinSock控件,所以在招聘软件开发人员时,就常常考查应聘者对WinSock的理解和掌握程度。下面我们以广电运通公司的WinSock考题为例,讲解如何答题。

题目:如何使用WinSock编写网络程序?请分别写出客户端和服务端的程序开发流程。

剖析:这道考题指明要使用WinSock来编写网络程序,就是要考查应聘者对WinSock的掌握程度。Winsock是网络数据传输控件,它可以与远程计算机建立连接,通过用户数据报协议 (UDP)或者传输控制协议 (TCP)进行数据交换。

一般用得较多的是TCP协议,所以解题最好也用TCP协议。在客户端指定服务器的端口和IP地址后,尝试和服务器建立连接,服务器在监听到客户端的连接请求后尝试与客户端建立通信,通信建立后,数据就可以交换了。

客户端开发流程:指定WinsockClient的Protocol为sckTCPPortocol,并指定服务器的IP地址和端口号,然后调用WinsockClient的Connect尝试建立和服务器的连接,如果没有连接上,则几秒后再次尝试建立连接直至连接成功,建立连接后使用SendData发送数据,使用GetData接收数据(图1)。

12-g13-1-1.jpg
图1

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

12-g13-1-2.jpg
图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协议, 就会博得考官的好感。