If IsConnectionOpen = True Then '连接上后,按钮的caption文字改变
Command1.Caption = "断开服务器"
Else '连接不上,按钮的caption文字改变,并且关闭SOCKS连接
Command1.Caption = "连接服务器"
MsgBox "无法连接到服务器!"
Winsock1.Close
End If
Else '如果caption为断开服务器,点击进行断开行为
Command1.Caption = "连接服务器" '改变caption
Shape1.BackColor = &H0& '控件显示为黑色,表示断开
'IsConnectionOpen = False
Winsock1.Close '关闭socks
End If
End Sub
Private Sub Command2_Click() '发送按钮,在处于连接状态的情况下,将发送
框的数据发送出去
If IsConnectionOpen = True Then
Winsock1.SendData Text3.Text
Else
MsgBox "未建立连接!"
End If '同服务器端一样
End Sub
Private Sub Command3_Click() '清空发送框数据
Text4.Text = ""
End Sub
Private Sub Command4_Click() '选择要保存的文件,随后收到的数据将写进这
个文件
On Error GoTo errhandler
CDia1.ShowOpen
Text5.Text = CDia1.FileName
Exit Sub
errhandler:
MsgBox "打开文件错误"
Exit Sub
End Sub
Private Sub Command5_Click() '清空接收数据
Text3.Text = ""
End Sub
Private Sub Command6_Click() '退出按钮
Winsock1.Close
Unload Me
End Sub
Private Sub Command7_Click() '接收完成后重置计数器,保证在不退出程序的
前提下,能够完整接收下一个
lenth = 0
i = 0
End Sub
Private Sub Form_Load() '装载程序
Form1.Left = (Screen.Width - Width) / 2
Form1.Top = (Screen.Height - Height) / 2
'Text1.Text = "127.0.0.1"
'Text2.Text = "7654" '程序启动时两个文本框先显示服务器的地址
'及端口号,无所谓,反正可以修改
Shape1.BackColor = &H0& '黑色 表示没有连接
IsConnectionOpen = False '一开始未联接
End Sub
Private Sub Text4_Change() '当接收框的显示达到一定长度,自动清空
If Len(Text4.Text) > 10000 Then
Text4.Text = ""
End If
End Sub
Private Sub Winsock1_Close() '关闭连接时
Winsock1.Close '关闭socks
Shape1.BackColor = &H0& '圆形shape显示为黑色
Command1.Caption = "连接服务器"
'IsConnectionOpen = False
'End '同服务器端一样
End Sub
Private Sub Winsock1_Connect() '联接成功时触发
IsConnectionOpen = True '给一个判断值,主要用于点击连接按钮
Shape1.BackColor = &HFF& '并且将shape显示为红色
'联接成功了
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '每当有数据
到达时
Dim str As String
Dim myFile() As Byte
Dim myLong As Double
Dim myPath As String
If Check1.Value = 0 Then '如果不选择保存到文件
Winsock1.GetData str '将接收的数据以字符串形式显示在接收显示框中
Text4.Text = Text4.Text & vbCrLf & str
'Text4.SelStart = Len(Text4.Text) '同服务器端一样
Else: 选择保存到文件的话
If Text5.Text <> "" Then ' 只要选择过保存的地址
ReDim myFile(0 To bytesTotal - 1)
ReadFileNo = FreeFile '分配一个不在使用中的文件号
Winsock1.GetData myFile '将接收的文件存进byte数组缓存
Open Trim(Text5.Text) For Binary As #ReadFileNo '打开要写进的文件
Put #ReadFileNo, lenth + 1, myFile '从标志位开始写进文件
Close #ReadFileNo '关闭文件
i = i + 1 '这个计数器主要用于后续扩展,暂时就是用于下面
Text4.Text = Text4.Text & vbCrLf & "已接收" & i & "块数据"
Winsock1.SendData "已接收" & i & "块数据"
lenth = lenth + UBound(myFile) - LBound(myFile) + 1 '标志位加上收
'服务器端
Option Explicit
Dim IsConnectionOpen As Boolean
Public ReadPos As Long '记录位置
Public ReadFileNo As Integer '读写文件号
Public Fleng As Long '长度
Public leng As Long
Private Sub Command1_Click()
Dim DSX() As Byte
Dim sT As String
Dim Psx(9) As Byte
Dim cs As Long
Dim i As Long
'以下Psx部分暂时未加功能,预留在这里留着做判断接收完成用。还打算在
If IsConnectionOpen = False Then
MsgBox "未建立有效连接!" '如果未建立连接,就弹出这么一个对话框
Else
If Check1.Value = 0 Then '是否选择文件发送框,不选的话
Winsock1.SendData Text2.Text
'Socket就这么把发送框的数据发出去了,很简单
Else
If Text4.Text = "" Then '选择了check1之后,如果文件目录选择框
的长度
ReadPos = 1 '此处请见MSDN的帮助
ReadFileNo = 8
Close #ReadFileNo
Open Trim(Text4.Text) For Binary As #ReadFileNo
'以下代码为分割文件 text5.text为每个包的长度(byte)。text6为
发送延时(MS)。
leng = CLng(Text5.Text)
If Fleng > leng Then
ReDim DSX(leng - 1) As Byte
Timer1.Interval = CLng(Text6.Text)
Timer1.Enabled = True
Get #ReadFileNo, ReadPos, DSX()
Winsock1.SendData DSX()
Else
ReDim DSX(Fleng - 1) As Byte
Get #ReadFileNo, ReadPos, DSX()
Winsock1.SendData DSX()
Close #ReadFileNo
End If
'Winsock1.SendData Psx()
End If
End If
End If
End Sub
Private Sub Command2_Click() '清空发送框数据
Text1.Text = ""
End Sub
Private Sub Command3_Click() '清空接收框数据
Text2.Text = ""
End Sub
Private Sub Command4_Click() '选择要发送的文件(这里用了一个Common
Dialog控件)
On Error GoTo errhandler
CDia1.ShowOpen '选择打开一个文件
Text4.Text = CDia1.FileName '文件路径显示在TEXT4里面
Exit Sub
errhandler:
MsgBox "打开文件错误"
Exit Sub
End Sub
Private Sub Command5_Click() '重新侦听一个新的端口
Winsock1.Close '侦听之前先把原先的socks连接关闭
Winsock1.LocalPort = CLng(Text3.Text)
Winsock1.Listen
End Sub
Private Sub Command6_Click() '点退出,先关闭端口,在卸载。
'(建议用退出按钮,我懒得写UNLOAD,如果直接点关闭可能会导致端口不关闭
示连接成功,黑色表示连接断开
IsConnectionOpen = False '开始状态为未联接
End Sub
Private Sub Text1_Change() '当接收框的文本达到一定长度的时候自动清空
If Len(Text1.Text) > 9000 Then
Text1.Text = ""
End If
End Sub
Private Sub Timer1_Timer() '这个时钟控件的目的是为了能延时发送包(大体
功能是结合发送按钮,并且选择了复选框的时候)
Dim DSX() As Byte '为字节数组,用来存储读写内容
ReadPos = ReadPos + leng '定位发送文件中的偏移指针
If (Fleng - ReadPos) > leng Then
ReDim DSX(leng - 1) As Byte
Get #ReadFileNo, ReadPos, DSX()
Winsock1.SendData DSX()
Else
ReDim DSX(Fleng - ReadPos) As Byte
Get #ReadFileNo, ReadPos, DSX()
Winsock1.SendData DSX()
Close #ReadFileNo
Timer1.Enabled = False
End If
End Sub
Private Sub Winsock1_Close() '对方Socket关闭触发这个事件
Winsock1.Close '先关闭自己
IsConnectionOpen = False
Shape1.BackColor = &H0&
Winsock1.LocalPort = CLng(Text3.Text) '自动重新侦听原端口
Winsock1.Listen
Command5.Enabled = True '重新侦听按钮可用
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) '接收
到对方联接
'请求触发这个事件
If Winsock1.State <> sckClosed Then Winsock1.Close '使Socket在接收
'联接请求之前保持关闭状态
Winsock1.Accept requestID 'Winsock1自己接收联接请求,与客户端Socket
'建立联接
IsConnectionOpen = True
Shape1.BackColor = &HFF&
Command5.Enabled = False
'现在联接好了
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '收到数据触
发这个事件
Dim str As String
Winsock1.GetData str '收到数据时,Winsock1把数据写入缓存str
Text1.Text = Text1.Text & vbCrLf & str
'Text1.SelStart = Len(Text1.Text)
'在文本框中显示接收的数据
End Sub