f
End Sub
3.发卷时服务器发送文件正文
Private Sub wisServer_SendComplete(Index As Integer)
Dim DataSize As Integer
Dim outFileData() As Byte
If Conns(Index).FinishSize < Conns(Index).FileSize Then ’此前文件已打开
DoEvents
If Conns(Index).FileSize - Loc(Conns(Index).FileNum) < MAXSENDSIZE Then
’MAXSENDSIZE是每次发送的最大字节数
DataSize = Conns(Index).FileSize - Loc(Conns(Index).FileNum)
Else
DataSize = MAXSENDSIZE
End If
ReDim outFileData(0 To DataSize - 1)
Get #Conns(Index).FileNum, , outFileData
wisServer(Index).SendData outFileData
Conns(Index).FinishSize = Conns(Index).FinishSize + DataSize
Else
Close (Conns(Index).FileNum)
End If
End Sub
说明:客户端
程序的交卷模块代码与此类似。
4. 客户端接收数据代码
Private Sub wisClient_DataArrival(ByVal bytesTotal As Long)
Dim inData As String
’用于接收辅助信息
Dim inFileData() As Byte
’用于接收文件正文
Dim GetRarFile As String, unRarTarget As String ’文件路径
If Not Recvd Then ’如果是首次接收
wisClient.GetData inData, vbString
’接收文件的大小信息
FileSize = CDbl(Val(inData))
Recvd = True
Else ’开始接收文件正文
ReDim inFileData(0 To bytesTotal - 1)
wisClient.GetData inFileData, vbArray + vbByte
Put FileNum, , inFileData
’此前文件已建立并打开
RecvdSize = RecvdSize + bytesTotal
If RecvdSize = FileSize Then
’接收完毕
Close (FileNum)
wisClient.Close
’由接收方关闭连接而非发送方,否则会丢失数据
GetRarFile = GhDir & “\” & txtGh & “.rar”
’GhDir是考试目录,txtGh存放考号
unRarTarget = GhDir & “\”
Pid = Shell(App.path & “\rar x -inul” & GetRarFile & unRarTarget) ’解压缩
hProcess=OpenProcess(PROCESS_
QUERY_INFORMATION, 0, Pid)
’调用WinAPI
Do ’等待解压缩结束
Call GetExitCodeProcess(hProcess, ExitCode)
DoEvents
Loop While ExitCode = STILL_ALIVE
Call CloseHandle(hProcess)
Kill GhDir & “\” & txtGh & “.rar”
MsgBox “发卷完毕”
Shell “C:\Windows\explorer.exe/n,
/e,” & GhDir, vbMaximizedFocus
Unload Me
End If
End If
End Sub
说明:服务器
程序中接收交卷的代码与此相似。
以上代码已在Windows 2000 Server、Windows XP、Windows 98平台下成功运行,并在实践中获得成功的应用。由于篇幅所限,在此没给出完整代码。
小 结
在本系统的编程中有两点值得注意: 一个是压缩-发送-解压缩的思路,另一个是用自定义数据类型数组保存考生(连接)的信息。当然,本系统只是解决了服务器与考生用机之间的安全问题,至于考生与考生之间通过文件夹共享互通
答案,也许只有采取暂时的物理隔离手段才是最有效的解决办法。