传输语音和文件都可以通过Mswinsock 实现,只是速度方面我没有试过,我正巧最近也弄了点Mswinsock 相关的东西,代码发给你看看,希望有帮助
传送文件对于网络编程来说是基本的功能,比如远程控制软件。在编制一个软件时,我从网上下了很多传文件的程序,这些程序提供的传文件功能根本就不能用。传文本还可以,传二进制文件根本就不行。因此,作为一个基本的功能模块,有必要单独介绍一下。
首先,在VB中要传送字符串,你可以这样写:
Dim strData As String
strData = "Test"
Winsock1SendData strData
但是如果你传送的二进制文件,你还能用String变量来存放吗?从理论上分析是不行的,我也做了实验,确实是不行的。文件虽然可以传,但是接受的文件和发送的不一样,原因可能是二进制文件里可以有任何"字符",但是不是所有的字符都可以放在String变量里。
除了String类型的变量,VB中其他类型的变量都只有几个字节长,难道一次只能发几个字节吗?那样岂不是要累死机器了!其实,情况没有那么悲观,我们完全可以使用数组来解决这个问题,就是使用byte数组。把要传送的文件都读到数组里,然后发送出去。程序如下:
FileName 为要传送的文件名,WinS为发送文件的WinSock控件。这是一个发送端的程序。
Public Sub SendFile(FileName As String, WinS As Winsock)
Dim FreeF As Integer ''空闲的文件号
Dim LenFile As Long ''文件的长度
Dim bytData() As Byte ''存放数据的数组
FreeF = FreeFile ''获得空闲的文件号
Open FileName For Binary As #FreeFile ''打开文件
DoEvents
LenFile = LOF(FreeFile) ''获得文件长度
ReDim bytData(1 To LenFile) ''根据文件长度重新定义数组大小
Get #FreeFile, , bytData ''把文件读入到数组里
Close #FreeFile ''关闭文件
WinSSendData bytData ''发送数据
End Sub
接受端的程序如下:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim bytData() As Byte
Dim f
f = FreeFile
Open strFileName For Binary As #f
ReDim bytData(1 To bytesTotal)
Winsock1GetData bytData
Put #f, i, bytData
i = i + bytesTotal ''保证每次写都是在文件的末尾, i是个全局变量
Close #f
End Sub
这里有两个需要注意的地方,ReDim Preserve bytData(1 To LenFile),下标是从1开始的,如果你写成ReDim bytData( LenFile),下标就是从0开始了,数组就有LenFile+1长了。LenFile = LOF(FreeFile)中的LOF是获得文件长度的函数,是VB里带的,我见过很多例子用API,或者循环的读直到末尾来获取文件长度,这样都是很麻烦的,使用LOF函数就可以了。
这样的程序,即可以传送文本文件,也可以传送二进制文件。但是你有没有发现这个程序的问题呢?如果我要传送一个50M的文件呢?系统可以为bytData分配50M的内存空间吗?
于是笔者拿一个50M的文件做实验吧,接收到的文件和原来的文件不一样,比原来的大。问题出在那呢?
首先,根据文件大小重新定义bytData数组的大小本身就有问题,系统是不可能无限制的给数组分配空间的,即使可以,也会造成系统响应变慢。在传50M文件的时候,系统就跟死机了一样。那么怎么解决这个问题呢,一个自然的想法就是把数据分段传送。程序如下:
发送程序, iPos是个全局变量,初始值为0。这个变量保存着当前数据的位置。Const iMax = 65535是每个数据块的大小。
Dim FreeF As Integer ''空闲的文件号
Dim LenFile As Long ''文件的长度
Dim bytData() As Byte ''存放数据的数组
FreeF = FreeFile ''获得空闲的文件号
Open FileName For Binary As #FreeF ''打开文件
DoEvents
LenFile = LOF(FreeF) ''获得文件长度
If LenFile <= iMax Then ''如果要发送的文件小于数据块大小,直接发送
ReDim bytData(1 To LenFile) ''根据文件长度重新定义数组大小
Get #FreeF, , bytData ''把文件读入到数组里
Close #FreeF ''关闭文件
WinSSendData bytData ''发送数据
Exit Sub
End If
''文件大于数据块大小,进行分块发送
Do Until (iPos >= (LenFile - iMax)) ''发送整块数据的循环
ReDim bytData(1 To iMax)
Get #FreeF, iPos + 1, bytData
WinSSendData bytData
iPos = iPos + iMax ''移动iPos,使它指向下来要读的数据
Loop
''这里要注意的是,必须检查文件有没有剩下的数据,如果文件大小正好等于数据块大小的
'' 整数倍,那么就没有剩下的数据了
ReDim bytData(1 To LenFile - iPos) ''发送剩下的不够一个数据块的数据
Get #FreeF, iPos + 1, bytData
WinSSendData bytData
Close #FreeF
下面是接收端的程序:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim bytData() As Byte
Dim lLenFile As Long
Dim f
f = FreeFile
Open strFileName For Binary As #f ''strFileName是文件名
lLenFile = LOF(f)
ReDim bytData(1 To bytesTotal)
Winsock1GetData bytData
If lLenFile = 0 Then ''lLenFile=0表示是第一次打开文件,这里有个问题,就是''如果如果该文件存在的话,就会出错,应该在打开前检查文件是否存在。(这里我省略了)
Put #f, 1, bytData
Else
Put #f, lLenFile + 1, bytData
End If
Close #f
End Sub
Dim vhour As Integer, vminute As Integer, vsecond As Integer
Private Sub Form_Load()
Timer1Enabled = True
Timer1Interval = 1000
End Sub
Private Sub Timer1_Timer()
vhour = Hour(Time)
vminute = Minute(Time)
vsecond = Second(Time)
If vminute = 0 And vsecond = 0 Then
WindowsMediaPlayer1URL = AppPath & "/现在时刻mp3"
WindowsMediaPlayer1Controlsplay
WindowsMediaPlayer1URL = AppPath & "/" & vhour & "mp3"
WindowsMediaPlayer1Controlsplay
End If
End Sub
没用过mic控件,用WindowsMediaPlayer控件代替了,人人电脑里都有(XP系统,部件拉到底)
窗体放一个WindowsMediaPlayer1,一个timer1
其中两段声音需要你自己准备的,你应该看得懂代码吧,准备好<现在时刻>的声音和0点到晚上11点的声音,apppath只想的是程序自身文件夹下,你保存下工程,再把音乐放到文件夹下就好了
我这里是用小时代替了音乐的名字 所以0点的音乐名应该是“0mp3” 1点是“1mp3”。。。晚上11点是“23mp3” 以此类推,还不明白加我QQ,程序没测试过。。。没耐心等。。。
可以从你这个程序进行扩展,正好之前,我参加一个项目是java聊天工具开发。
虽然编程语言不同,但是思路是相同的。
你现在已经有一个客户端程序和服务端程序了。
目前一般的聊天工具都是在服务端转送文本,而像视频、语音则是用点对点。
在服务端用winsock控件数组监听多个客户端,每一个winsock控件对应一个连接到客户端。
客户端不用改很多。
但多人聊天,比较复杂,需要加入简单的聊天协议。
就最简单的来说是首字母协议。
客户端要发送信息给另一个客户端,
比如P [另一个客户端的名字] 文本内容,
到了服务器,服务器根据首字母,和给出的客户端名字,在winsock数组中查找到对应的连接,再转发到对应的客户端。
大概就是这样。
引用:
Microsoft Speech Object Library
代码
通用部分
Dim Voice As New SpVoice
执行部分
VoliceSpeak Text1Text
不明白再Hi我
我的理解是这样的:
我们的目的:向文本框输入语音文字
操作过程就得分两步:
一:获取语音文字进行存储
二:将语音文字写入文本框
这样实施起来你就有了明确的操作过程。
语音识别这方面的技术我现在没有,你可以在网上查找相应的技术或者购买相应的技术,只要将语音转换成了文字,相信再写入文本框你就可以很简单的操作了
欢迎分享,转载请注明来源:表白网
评论列表(0条)