说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

高手来找茬,高分等你拿~

编辑:说三道四文库 发布时间:2018-02-24 12:23
HTML文档下载 WORD文档下载 PDF文档下载

偶用VB的winsock想编一个语音传输的东东,结果调试了好久不能通过,希望各位高手帮忙找找错误,
偶把程序最主要的部分帖出来,大家帮忙看看,先谢了~
给分原则:提意见10分,找到一个错误20分(并帮忙改正30分),有更好的代码40分(错误或代码请说得详细些)

-----------------
服务器端
-----------------
Option Explicit

'初始化
Private Sub Form_Load()
TcpS.LocalPort = 1801 '设置端口         ’TCPS为服务器端winsock控件
TcpS.Listen   '监听

'响应连接
Private Sub TcpS_ConnectionRequest(ByVal requestID As Long)
 If TcpS.State <> sckClosed Then TcpS.Close
 TcpS.Accept requestID
End Sub

'文件接收
Private Sub TcpS_DataArrival(ByVal bytesTotal As Long)
Dim flen As Long
Dim myfile As Byte
TcpSLen.GetData flen          'TcpSLen为接受文件长度的winsock控件
Open "d:\hello.wav" For Binary As #2
Do While (LOF(2) < flen)     '判断文件是否读完
TcpSFile.GetData myfile      '接受文件
Put #2, , myfile             '按字节字节写入目标文件
Loop
Close #2
 MsgBox "文件传送完毕!"
End Sub

Private Sub Form_Unload(Cancel As Integer)
TcpSLen.close
TcpS.Close
End Sub

Private Sub TcpS_Close()
If TcpS.State <> sckClosed Then TcpS.Close
  MsgBox "服务器通道已关闭!"
  End
End Sub

Private Sub TcpS_Connect()
  MsgBox "连接成功!"
End Sub


-------------------------
客户端
-------------------------
'初始化
Private Sub Form_Load()
TcpC.RemoteHost = "wp"              'TcpC为客户端winsock控件
TcpC.RemotePort = 1801
TcpC.LocalPort = 1802
TcpC.RemoteHostIP = TcpC.LocalIP          '在同一个机器里运行,测试时服务器和客户端IP相同
CommonDialogC.FileName = "*.wav"
End Sub

Private Sub Form_Unload(Cancel As Integer)
TcpC.Close
TcpCLen.Close
End Sub

'建立连接
Private Sub CmdConnect_Click()
TcpC.Connect
On Error GoTo TransferError
CState.Caption = "连接中..."
TransferError:
MsgBox "服务器未开或网络出错!"
End
End Sub

'接收文件
Private Sub CmdSoundSend_Click()
Dim myfile As Byte
Dim flen As Long
Open "d:\hi.wav" For Binary As #1
flen = LOF(1)         '文件长度
TcpCLen.SendData (flen)  '接受文件长度的winsock控件
Do While Not EOF(1)  '判断是否到达文件末尾
Get #1, , myfile     '按字节读文件
TcpCFile.SendData myfile '按字节传文件
Loop
Close #1
 MsgBox "传送完毕!"
End Sub

Private Sub TcpC_Close()
 MsgBox "服务器通道已关闭!"
  End
End Sub

Private Sub TcpC_Connect()
  MsgBox "连接成功!"
End Sub

-----------------------------------


问题1:不能实现传输,连接不成功

问题2:服务器端在VB里只能运行一次,第二次运行就死了,将TcpS.Listen注释掉就好了,
怀疑是winsock控件的问题,但是关闭FORM时确实执行了Tcps.close,不解?(客户端没有这种情况!)

问题3:服务器端的TcpSLen是否也可用TcpS控件代替,这样传数据时会不会乱?

问题4:如果加上文本聊天等功能,数据传输是否都可用一个winsock控件,怎么解决?
如果文件传输和文字传输各单独用一个winsock控件是否初始化时都要设置端口,建立监听等?

问题5:文字聊天的代码,加进去有没有错?
'发送文本信息
Private Sub CmdSend_Click()
TcpCTxt.SendData TxtSend.Text
End Sub
'接受文本信息
Private Sub TcpC_DataArrival(ByVal bytesTotal As Long)
Dim TxtDate As String
TcpC.GetData TxtDate
TxtReceive.Text = TxtDate
End Sub

问题6:这个程序主要用来传语音,这种编码是否不妥?谁有更好,效率更高的代码?
'附传输文件的另一种编码
 Dim i, j, flen As Long
   flen = FileLen(CommonDialogC.FileName)
    For i = 0 To flen \ 4000
    If flen < 4000 Then
     ReDim myfile(1 To flen) As Byte
       Open CommonDialogC.FileName For Binary As #1
       Get #1, i * 4000 + 1, myfile
       Close #1
       TcpCFile.SendData myfil
     Else
       ReDim myfile(1 To flen) As Byte
       Open CommonDialogC.FileName For Binary As #1
       Get #1, i * 4000 + 1, myfile
       Close #1
       TcpCFile.SendData myfil
      flen = flen - 4000
    End If
 Next i

★问题7:在这个基础上,如何实现语音的实时传输(像电话一样发送端边录边传,接收端边收边放)
   或者简单一点发送端录完就传,接收端收完就放
-----------------------
高手来找茬,高分等你拿~
up
,,
这么多问题??
给你一段代码,功能和你的完全一样。
server端:
drive、dir、command、winsock各一个
winsock  名称:wstcp

Option Explicit

Dim lPos As Long

Private Sub cmdRun_Click()
  If cmdRun.Caption = "Run" Then
    cmdRun.Caption = "Stop"
    wsTCP(0).LocalPort = 1111
    wsTCP(0).Listen
  Else
    wsTCP(0).Close
    cmdRun.Caption = "Run"
  End If
End Sub

Private Sub Drive1_Change()
  Dir1.Path = Drive1.Drive & "\"
End Sub

Private Sub wsTCP_Close(Index As Integer)
  Close #1
  Unload wsTCP(1)
End Sub

Private Sub wsTCP_ConnectionRequest(Index As Integer, ByVal requestID As Long)
  Load wsTCP(1)
  wsTCP(1).Accept requestID
  If Dir(Dir1.Path & "\temp") <> "" Then Kill Dir1.Path & "\temp"
  Open Dir1.Path & "\temp" For Binary As 1
  lPos = 1
End Sub

Private Sub wsTCP_DataArrival(Index As Integer, ByVal bytesTotal As Long)
  Dim buffer() As Byte
  wsTCP(1).GetData buffer
  Put #1, lPos, buffer
  lPos = lPos + UBound(buffer) + 1
End Sub
============================================================
client端

Option Explicit

Dim buffer() As Byte
Dim lBytes As Long

Private Sub cmdBrowse_Click()
  dlg.ShowOpen
  txtFile = dlg.FileName
End Sub

Private Sub cmdSend_Click()
  cmdSend.Enabled = False
  lBytes = 0
  ReDim buffer(FileLen(dlg.FileName) - 1)
  Open dlg.FileName For Binary As 1
  Get #1, 1, buffer
  Close #1
  Load wsTCP(1)
  wsTCP(1).RemoteHost = "172.16.1.17"
  wsTCP(1).RemotePort = 8896
  wsTCP(1).Connect
  lblStatus = "Connecting..."
End Sub

Private Sub wsTCP_Close(Index As Integer)
  lblStatus = "Connection closed"
  Unload wsTCP(1)
End Sub

Private Sub wsTCP_Connect(Index As Integer)
  lblStatus = "Connected"
  wsTCP(1).SendData buffer
End Sub

Private Sub wsTCP_SendComplete(Index As Integer)
  lblStatus = "Send complete"
  Unload wsTCP(1)
  cmdSend.Enabled = True
End Sub

Private Sub wsTCP_SendProgress(Index As Integer, ByVal bytesSent As Long, ByVal bytesRemaining As Long)
  lBytes = lBytes + bytesSent
  lblStatus = lBytes & " out of " & UBound(buffer) & " bytes sent"
End Sub
这个代码可以让服务端运行后,客户可以多次传送。
如果要实现类似于聊天的功能,建意先在一新的程序里写,很简单
www.dapha.net上也有很多代码。
谢了!
学习winsock
《原码空间》上有例子

http://www.playicq.com/
传输部分?


俺对语音时实时压缩及解压部分感兴趣!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘